#java #java-stream
Вопрос:
У меня есть такой класс, как следующий,
public class Inventory { private String name; private Listlt;Samplegt; samples; } public class Sample { private int count; private String date; } Listlt;Inventorygt; inventories;
Я отсортировал samples
их по дате. Все в порядке. Но мне нужно отсортировать inventories
список по date
полю внутри образца класса. samples
уже отсортированы. Поэтому мне нужны описи для сортировки по датам образцов. Например,
Внутри этого inventories
списка, если в нем есть 3 данных,
Inventory 1 name = 1 samples has dates of = List of (2021-07-02, 2021-07-03) Inventory 2 name = 2 samples has dates of = List of (2021-07-02, 2021-09-03, 2021-10-03) Inventory 3 name = 3 samples has dates of = List of (2021-08-02, 2021-09-03)
Таким образом, он должен отсортироваться по дате, и в этом inventories
списке у него должны быть данные следующим образом,
Inventory 1 Inventory 3 Inventory 2
Комментарии:
1. Как следует сортировать запасы на основе выборочных дат? Вы хотите использовать самую раннюю или последнюю дату выборки для каждого инвентаря?
Ответ №1:
Вы хотите сортировать коллекции на основе значений во вложенных коллекциях. Как мы это делаем?
Для этого вам необходимо реализовать пользовательский компаратор …
static class InventoryComparator implements Comparatorlt;Inventorygt; { public int compare(Inventory i1, Inventory i2) { // compare them here like this // a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second. // this can be done by checking the nested lists } }
Затем вы можете отсортировать свою коллекцию следующим образом …
Collections.sort(inventoryList, new InventoryComparator());
Комментарии:
1. Большое вам спасибо за ответ, а также за потраченное время.
Ответ №2:
Это возможно с Comparable
помощью интерфейса.
Я предположил , что Sample
объекты сортируются по дате, а Inventory
объекты сортируются путем сравнения последнего ( Sample
с последней датой) Sample
samples
, но вы можете реализовать свою собственную логику сравнения в Sample
переопределенном compareTo()
методе.
public class Inventory implements Comparablelt;Inventorygt; { private String name; private Listlt;Samplegt; samples; public Listlt;Samplegt; getSamples() { return samples; } public Inventory(String name, Listlt;Samplegt; samples) { this.name = name; this.samples = samples; } @Override public int compareTo(Inventory inventory) { Optionallt;Samplegt; thisOldestSample = this.getSamples().stream().sorted().reduce((s1, s2) -gt; s2); Optionallt;Samplegt; thatOldestSample = inventory.getSamples().stream().sorted().reduce((s1, s2) -gt; s2); if (thisOldestSample.isPresent() amp;amp; thatOldestSample.isPresent()) { return thisOldestSample.get().compareTo(thatOldestSample.get()); } else { return 0; } } } public class Sample implements Comparablelt;Samplegt; { private int count; private String date; public String getDate() { return date; } public Sample(int count, String date) { this.count = count; this.date = date; } @Override public int compareTo(Sample sample) { return LocalDate.parse(sample.getDate()).isBefore(LocalDate.parse(this.getDate())) ? 1 : -1; } } @Test void shouldSortInventoriesBasedOnSampleDate() { Inventory one = new Inventory("1", List.of(new Sample(0, "2021-07-02"), new Sample(1, "2021-07-03"))); Inventory two = new Inventory("2", List.of(new Sample(0, "2021-07-02"), new Sample(1, "2021-09-03"), new Sample(2, "2021-10-03"))); Inventory three = new Inventory("3", List.of(new Sample(0, "2021-08-02"), new Sample(1, "2021-09-03"))); Listlt;Inventorygt; unsorted = List.of(one, two, three); Listlt;Inventorygt; sorted = unsorted.stream().sorted().collect(Collectors.toList()); assertEquals(one, sorted.get(0)); assertEquals(three, sorted.get(1)); assertEquals(two, sorted.get(2)); }
Комментарии:
1. Большое вам спасибо за ответ, а также за потраченное время.