Как отсортировать список, проверив значение внутри внутреннего списка в Java?

#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. Большое вам спасибо за ответ, а также за потраченное время.