#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));