2014-12-13 15 views
0

У меня есть следующие объекты данных:Какой тип списка/карты следует использовать для категоризации данных, но с сохранением порядка?

MyObject { 
    priority (e.g. HIGH, LOW, ...) 
    information 
} 

Мне нужно, чтобы сохранить их в правильном порядке итерации над ним, если это необходимо.

Мне также нужно получать только данные с приоритетом HIGH или LOW иногда (также в правильном порядке).

Если я использую Список (например, ArrayList), мне придется перебирать каждый объект данных для поиска моих приоритетов.

Если я использую Map<Priority, List<Information>>, я бы потерял заказ между информацией в двух разных приоритетах.

Пример входных данных:

  1. LOW, "hello1"
  2. HIGH, "hello2"
  3. LOW, "World3"
  4. HIGH, "World4"

Желаемая результаты:

printData() -> Hello1, Hello2, World3, World4 
printLow() -> Hello1, World3 
printHigh() -> Hello2, World4 

Какая структура данных будет соответствовать моим требованиям в лучшем случае? (Java)

+1

Использовать 'LinkedHashMap' –

+0

Не могли бы вы показать мне пример того, как реализовать? Должен ли я иметь LinkedHashMap <Приоритет, MyObject> или что вы рекомендуете? – Frame91

+0

У вас может быть LinkedHashMap <Приоритет, ArrayList > –

ответ

1

Если Перебор список действительно слишком медленно, а затем поддерживать две параллельные коллекции:

  • List<Information> перебрать всю информацию в порядке,
  • и Map<Priority, List<Information>> для перебора информацию о данном приоритете.

Я бы сделал это только в том случае, если у меня была проверенная проблема с производительностью, и я доказал, что она была вызвана итерацией по списку всех сведений. В противном случае, это преждевременная оптимизация, что делает код сложнее поддерживать и делать правильно, особенно если коллекция изменчива.

+0

Спасибо за ваш ответ! У меня нет проблемы с производительностью и явным образом могу использовать один список для перебора.Я просто подумал, что может быть более удобный способ сделать это в Java;) – Frame91

1

Используйте HashMap и индивидуальный список, как показано ниже:

public enum Priority { .... }; 
Map<Priority, List<Information>> map = new HashMap<Priority, List<Information>>(); 
map.put(Priority.HIGH, new LinkedList<Information>()); 
map.put(Priority.MID, new LinkedList<Information>()); 
map.put(Priority.LOW, new LinkedList<Information>()); 
List<Information> infoOrderedList = new LinkedList<Information>(); 

public void putInfo(MyObject myobject) { 
    List<Information> infoList = map.get(myObject.getPriority()); 
    infoList.add(myobject.getInformation()); 
    infoOrderedList.add(myobject.getInformation()); 
} 

public void removeInfo(MyObject myobject) { 
    List<Information> infoList = map.get(myObject.getPriority()); 
    infoList.remove(myobject.getInformation()); 
    infoOrderedList.remove(myobject.getInformation()); 
} 
+0

Как бы вы реализовали 'printData()', как запросил OP? –

+0

Он может использовать infoOrderedList для печати данных, а getLow/getHigh с o (1) на карте? – SMA

+0

Итак, в основном ваш ответ теперь такой же, как у меня, за исключением того, что он настаивает на использовании LinkedHashMap и LinkedList, хотя это не имеет никакого преимущества перед любой другой картой или списком. –

1

Вы можете избежать явной итерации с помощью лямбды и фильтрации в списке. Например, если вы хотите, чтобы получить список приоритетных вопросов, просто введите:

List<MyObject> high = list.stream().filter(o -> o.priority == Priority.HIGH).collect(Collectors.toList()); 

Использования ArrayList вы держите сортировку. Для повышения производительности вы можете использовать parallelStream() вместо stream()

+0

Это будет работать точно. Однако это неэффективно, так как эта реализация не позволяет выполнять итерацию через каждый объект (он просто «скрыт» в выражении лямбда). – Frame91

+0

С помощью лямбда операции могут выполняться параллельно. С современным оборудованием вы более эффективно используете процессор. До вас, чтобы посмотреть, стоит ли его реализовать с более сложным алгоритмом Collection /. –

+0

Быстрый вопрос: будет ли parallelStream() поддерживать порядок объектов? – Frame91