Как отсортировать многомерный массив объектов на основе определенного элемента в Java

#java #sorting

#java #сортировка

Вопрос:

Я создаю многомерный массив объектов, и я хотел бы отсортировать его по определенному элементу внутри подмассивов.

Я пробовал коллекции.сортировка и пузырьковая сортировка, но они не сработали.

 Object[][] fields = {{
      "sam", "mccarty",
      "m", "1988/06/01", 5.0, true
   },
   {
      "tom", "huges",
      "m", "1988/06/01", 7.0, true
   },
   {
      "jim", "ross",
      "m", "1988/06/01", 6.5, true
   }
};
  

Я ожидаю, что массив будет отсортирован по подэлементу [4], поэтому:

  {
   {
      "tom", "huges",
      "m", "1988/06/01", 7.0, true
   },
   {
      "jim", "ross",
      "m", "1988/06/01", 6.0, true
   },
   {
      "sam", "mccartney",
      "m", "1988/06/01", 5.5, true
   }
}
  

Комментарии:

1. что это sub-element [4] ?

2. Почему бы не создать класс, содержащий элементы строки, и не иметь простой массив с объектами этого класса?

3. Например, 7.0 в { «tom», «huges», «m», «1988/06/01», 7.0, true }

4. Вы должны использовать интерфейс Comparator для сортировки его по определенному элементу.

5. @JoakimDanielson потому что код был написан другим разработчиком, и я должен продолжать, сохраняя эту структуру.

Ответ №1:

Если все ваши поля следуют одной и той же схеме, возможно, стоило бы обернуть их, скажем, внутри какого-нибудь объекта Person , чтобы у вас получился одномерный массив, а затем отсортировать указанный массив с помощью пользовательского компаратора.

Вы могли бы сделать что-то вроде этого:

 Person[] fields = {
    new Person("sam", "mccarty", "m", "1988/06/01", 5.0, true),
    ...
};
// Assuming you want things to be sorted in descending order like in your example.
Collections.sort((o1, o2) -> o2.getFourth() - o1.getFourth());
  

Вы можете найти больше информации о компараторах в документах
здесь.

Ответ №2:

Вы можете использовать :

 Arrays.sort(fields, (o1, o2) -> Double.compare((Double) o1[4], (Double) o2[4]));
  

Вывод двойных значений после сортировки является :

 5.0
6.5
7.0
  

Лучшее решение

но я бы создал объект, поместил необходимое поле вот так :

 class MyObject{
    private String fname;
    private String lname;
    private String gender;
    private LocalDate birthDay;
    private Double note;
    private boolean check;
   // @Getter @Setter @Constructors
}
  

тогда сортировка может быть простой :

 MyObject[] array = {...};
Arrays.sort(array, Comparator.comparing(MyObject::getNote));