2016-12-01 2 views
0

Я работаю с List из Person объектов. Я пытаюсь быстро идентифицировать и вернуть все Person с максимальной датой.Проблема с Java и максимальным значением

Например:

Persons:[ 
{ 
    id: 1 
    submitDate: 2010-01-01 
    name : john Smith 
}, 
{ 
    id: 1 
    submitDate: 2011-01-01 
    name : john Smith 
}, 
{ 
    id: 2 
    submitDate: 2011-01-02 
    name : jason Doe 
}, 
{ 
    id: 1 
    submitDate: 2012-01-01 
    name : john Smith 
}, 
{ 
    id: 1 
    submitDate: 2013-01-01 
    name : john Smith 
}, 
{ 
    id: 2 
    submitDate: 2013-01-02 
    name : jason Doe 
} 
] 

Я ищу способ, в Java, чтобы вернуть следующее (Макс submitDate значение):

Persons: [ 
{ 
    id: 1 
    submitDate: 2013-01-01 
    name : john Smith 
}, 
{ 
    id: 2 
    submitDate: 2013-01-02 
    name : jason Doe 
} 
] 

Любые мысли о том, как этого достичь?

================================================================================================================================== ========================== Я пробовал:

List<Person> personList = Lists.newArrayList(); 
getPersonList().stream() 
       .map(this.setSource) 
       .max(Comparator.comparing(Person::getSubmitDate)) 
       .map(personList::add); 

Однако он возвращает один Person записи, а не максимальной submitDate для каждогоPerson

+0

Для поиска в будущем и записи используйте слово 'distinct', если вы хотите устранить повторяющиеся значения. Кроме того, учитывая данные вашего примера, я не вижу, что вы идете на «максимум», я вижу только устранение дубликатов, чтобы сделать отдельный список. Измените свой вопрос, чтобы уточнить. Возможный дубликат: [Java - Distinct List of Objects] (http://stackoverflow.com/q/1019854/642706) –

+0

@BasilBourque, если вы читаете выше, я указываю «Я пытаюсь быстро идентифицировать и вернуть все« Личность » 'с максимальной датой". Я согласен, что мог бы изначально написать свой вопрос, объяснив, что хочу получить максимальную дату для каждого человека (на основе идентификатора). Однако я вернулся и объяснил себя в своем «редактировании». – Dan

+0

Я был неверным в последней части моего комментария выше о том, что вы не выполняете «максимум». Неправильные даты, когда я смотрел только на месяц, но не на год. Возможно, вам нужно немного отредактировать части за месяц-месяц значений примера, чтобы другие не делали ту же ошибку. –

ответ

0
List<Person> persons = ... 
    List<Person> resultList = new ArrayList<>(); 
    Map<Integer, List<Person>> personsBySubmitDate = 
      persons.stream().collect(Collectors.groupingBy(person -> person.getId()); 

    for (Map.Entry<Integer, List<Person>> entry : personsBySubmitDate.entrySet()) { 
     Person currentPerson = entry.getValue() 
            .stream() 
            .max(Comparator.comparing(Person::getSubmitDate)) 
            .orElse(null); 
     resultList.add(currentPerson); 
    } 

Это должно быть O (N).

+0

Я сделаю это. Благодаря! – Dan

+0

ничего не собирать. 'max()' метод возвращает Необязательный, который является в основном оболочкой для вашего объекта Person. Вы можете получить к нему доступ, вызвав метод get. Но убедитесь, что он присутствует! – Default71721

+0

К сожалению, использование '.max' возвращает мне одну запись (Max of ** all **' Person'), а не максимальную дату для каждого 'Person' – Dan

0

@ Default71721, ваш ответ работает отлично, однако я заметил, что более длинные списки действительно забивают систему (обработка O (n^2)). Я решил переписать SQL-запрос, который показал нам необходимую нам скорость.

Благодарим за помощь!

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