Сортировка списка массивов

203
28 декабря 2021, 19:50

Имеется список содержащий массивы

    TreeList<String[]> familyRegion=new TreeList();
            familyRegion.add(new String[]{"Доктор","Иванов Иван Иванович","12.01.1960","г.Москва"});
            familyRegion.add(new String[]{"Тракторист","Сидоров Иван Петрович","12.01.1970","г.Челябинск"});
            familyRegion.add(new String[]{"Академик","Артюков Альберт Иванович","14.08.1950","г.Москва"});
            familyRegion.add(new String[]{"Стоматолог","Бирюков Петр Иванович","17.01.1960","г.Санкт-Петербург"});
familyRegion.sort(new CompArray());

Необходимо отсортировать список по второму элементу (ФИО) я сделал компаратор

private class CompArray implements Comparator
    {
        @Override
        public int compare(Object o1, Object o2) {
            String[]obj1= (String[]) o1;
            String[]obj2= (String[]) o2;
            return obj1[1].compareTo(obj2[2]);
        }
    }

Однако он не работает, подскажите, в чем ошибка?

Answer 1

Это вообще неправильный подход. Во-первых, хранить данные о человеке в массиве сток - совсем не вариант. Во-вторых, какого результата вы ожидаете от сортировки списка массивов? Отсортировать каждый массив по алфавиту, а потом отсортировать массивы между сосбо, исходя из алфавитов каждой переменной??? Я даже это сформулировать не могу... И еще, я не знаю, что такое TreeList, может он совсем не гарантирует порядок элементов(как, например, хешсет), поэтому беру стандартную коллекцию для примера. Предлагаю пойти нормальным путем:

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Book {
    public static void main(String[] args) {
        List<Person> familyRegion = new ArrayList();
        familyRegion.add(new Person ("Доктор", "Иванов Иван Иванович", LocalDate.of(1960, 1, 12), "г.Москва"));
        familyRegion.add(new Person ("Доктор", "Иванов Иван Иванович", LocalDate.of(1960, 1, 12), "г.Москва"));
        familyRegion.add(new Person ("Тракторист", "Сидоров Иван Петрович", LocalDate.of(1970, 1, 12), "г.Челябинск"));
        familyRegion.add(new Person ("Академик", "Артюков Альберт Иванович", LocalDate.of(1950, 8, 14), "г.Москва"));
        familyRegion.add(new Person ("Стоматолог", "Бирюков Петр Иванович", LocalDate.of(1960, 1, 17), "г.Санкт-Петербург"));
        Collections.sort(familyRegion);
    }
}
class Person implements Comparable<Person>{
    private final String name;
    private final LocalDate birthDate;
    private final String city;
    private final String profession;
    public Person(String profession, String name, LocalDate birthDate, String city) {
        this.name = name;
        this.birthDate = birthDate;
        this.city = city;
        this.profession = profession;
    }
    public String getName() {
        return name;
    }
    public LocalDate getBirthDate() {
        return birthDate;
    }
    public String getCity() {
        return city;
    }
    public String getProfession() {
        return profession;
    }
    @Override
    public int compareTo(Person p) {
        int compareName = name.compareTo(p.getName());
        if (compareName!=0) return compareName;
        else return birthDate.compareTo(p.getBirthDate());
    }
}
Answer 2
private class CompArray implements Comparator
    {
        @Override
        public int compare(Object o1, Object o2) {
            String[]obj1= (String[]) o1;
            String[]obj2= (String[]) o2;
            return obj1[1].compareTo(obj2[1]);
        }
    }
READ ALSO
Сортировка одинаковых фамилий

Сортировка одинаковых фамилий

Имеется следующий код

206
FCM уведомления не доходят

FCM уведомления не доходят

Не приходят push уведомленияПри отсылке сервер гугла возвращает {"multicast_id":410383576077558298,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1576316927466102%b078b91ff9fd7ecd"}]}...

184
фон svg через js

фон svg через js

Есть блок с svg, в котором меняется цвет при клике на блокhttp://u558049

92