У меня есть List
объектов следующего класса:
public class Foo {
private Date date;
private String name;
private Long number;
}
Этот список извлекается из базы данных с order by date asc, number desc
, но часть, которую нужно постоянно сохранять, это упорядочение по date asc
.
Пример результата (Dateformat = MM/dd/yyyy
):
01/01/2016 Name1 928562
01/01/2016 Name2 910785
01/01/2016 Name3 811290
01/01/2016 Name4 811289
01/01/2016 Name5 5000000
02/01/2016 Name3 877702
02/01/2016 Name1 852960
02/01/2016 Name2 749640
02/01/2016 Name4 749500
02/01/2016 Name5 5000000
Теперь я хочу упорядочить этот список, чтобы он выглядел так:
01/01/2016 Name2 910785
01/01/2016 Name1 928562
01/01/2016 Name3 811290
01/01/2016 Name4 811289
01/01/2016 Name5 5000000
02/01/2016 Name2 749640
02/01/2016 Name1 852960
02/01/2016 Name3 877702
02/01/2016 Name4 749500
02/01/2016 Name5 5000000
Как видите, теперь он сортируется по возрастанию по дате и имени. Порядок имен хранится в другом списке (NameSortingList
):
Name2
Name1
Name3
Обратите внимание, что Name4
и Name5
отсутствуют в NameSortingList
, не могут быть добавлены к нему и, следовательно, должны добавляться после всего, что заказано. Все, что идет после упорядоченного списка, может иметь любой порядок.
Если это облегчает задачу, все, что отсутствует в lsit, можно объединить в одну Foo
на уникальную дату с name = "Other"
, которая суммирует Numbers
всех элементов в нем. Пример такого результата:
01/01/2016 Name2 910785
01/01/2016 Name1 928562
01/01/2016 Name3 811290
01/01/2016 Other 5811289
02/01/2016 Name2 749640
02/01/2016 Name1 852960
02/01/2016 Name3 877702
02/01/2016 Other 5749500
Мой текущий подход к этой сортировке состоит в том, чтобы сначала извлечь все даты в виде значений unqiue, затем создать NameSortingList, а затем выполнить многократное повторение данных, чтобы добавить данные в правильном порядке. У меня есть проблема
- Может пропустить записи, если имя не существует в
NameSortingList
- Производительность действительно очень плохая
data
- это список Foo
, как описано в самом верху:
List<String> sortedNames = data.stream().filter(e -> e.getDate().equals(getCurrentMonthDate()))
.map(e -> e.getName()).collect(Collectors.toCollection(ArrayList<String>::new));
Set<Date> uniqueDates = data.stream().map(e -> e.getDate())
.collect(Collectors.toCollection(LinkedHashSet<Date>::new));
List<Foo> sortedFoo= new ArrayList<Foo>();
for (Date d : uniqueDates) {
for (String name : sortedNames) {
for (Foo fr : data) {
if (fr.Date().equals(d) && fr.getName().equals(name)) {
sortedFoo.add(fr);
break;
}
}
}
}
Как я могу исправить 2 проблемы, которые я описал? Может быть, есть даже потоковое решение, которое я не мог бы обернуть?
Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать