2016-10-22 2 views
-1

Предположим, у меня есть List, которая содержит предметы типа ENTITY. ENTITY имеет целое поле, которое определяет его естественный порядок. Я хочу получить ENTITY, который является максимальным или минимальным, исходя из значения этого поля. Как я могу реализовать это на Java?Сортировка списка по полю на каждом из его членов

List<ENTITY> lt = new ArrayList<ENTITY>(); 

class ENTITY 
{ 
    int field; 
    /* Constructor, getters, setters... */ 
} 
+0

Я голосую, чтобы закрыть этот вопрос, потому что нет никаких научно-исследовательских работ из ОП. – silentprogrammer

+0

Я знаю, что написать пользовательский сопоставитель - один из способов его реализации, любой другой лучший способ? – Jason

+0

@silentprogrammer И даже не попытка смутно правильной Java. – chrylis

ответ

1
//stream the elements, map to their fields, and get the max 
return lt.stream().max((e1, e2) -> Integer.compare(e1.filed, e2.filed)).orElse(/* default */); 

Только один из многих приложений Java 8 в поток апи.

Хотя я бы предложил сначала работать над некоторыми соглашениями о кодировании.

+0

мы просто работаем над Java 7, и мы не можем использовать Java в нашей среде. – Jason

+0

Это та же концепция, вы просто повторяете элементы вашего списка и найдите тот, у которого есть значение, которое вы ищете (например, значение max 'filed'). Это основные концепции Java, если вы не перешли через циклы, которые я предлагаю начать здесь: https://docs.oracle.com/javase/tutorial/java/index.html – Rogue

+0

Я хочу, чтобы похож на Java 8 stream api, однако работает на Java 7 – Jason

2

Используйте Collections.sort с Comparator, чтобы отсортировать ваш список. В зависимости от того, сортируете ли вы восходящий или нисходящий, позиции элементов max и min будут отличаться. В любом случае они будут на противоположных концах, один в верхней части списка и один внизу. Для сортировки в порядке возрастания (наименьший элемент в начале списка, крупнейший в конце), вы можете использовать что-то вроде этого:

Collections.sort(lt, new Comparator<ENTITY> { 
    public int compare(ENTITY o1, ENTITY o2) { 
     if (o1 == null) { 
      if (o2 == null) { 
       return 0; 
      } 
      return -1; 
     } 
     else if (o2 == null) { 
      return 1; 
     } 

     // If field is Comparable: 
     return o1.getField().compareTo(o2.getField()); 

     // OR - If field is an int 
     return o1.getField() < o2.getField() ? -1 : (o1.getField() > o2.getField() ? 1 : 0); 
    } 
}); 
+0

Кажется, мне все еще нужно написать пользовательский сопоставитель, кажется, что нет простого способа реализовать его как stream api в Java 8 – Jason

+0

@Jason Не уверен, что вы подразумеваете под «простым способом» «... несколько строк кода выше не особо сложны. Stream API недоступен в Java 7, но люди сортировали списки и находили значения max и min задолго до того, как Java 8 был концептуализирован. – nbrooks

Смежные вопросы