Как сделать сортировку списка в Android?

161
17 января 2019, 13:50

У меня в приложении есть список сообщений (входящие и исходящие) и я хочу их сортировать по возможности по трем параметрам: текст сообщения, отправитель и тема. Если никакой сортировки не выбрано то просто выводить список всех несортированных сообщений.

Эта сортировка будет находится в Spinner где будут все параметры сортировки. Я нашел способ сортировки. Но у меня получается сортировать только по одному параметру, например по отправителю, а мне нужно сделать так чтобы была возможность менять фильтр. Вот что я нашел:

Класс для сортировки:

public class DateSort implements Comparator <Message> {
    @Override
    public int compare(Message message, Message t1) {
        return message.getSender_name().compareTo(t1.getSender_name());
    }
}

и дальше вот как его использовать для сортировки:

List<DataEntity> data= new ArrayList<DataEntity>();
DateSort ds = new DateSort();
try{Collections.sort(data, ds);}
catch(Exception es){};

все работает так как нужно, но есть один вопрос - нужно ли мне будет создавать несколько классов сортировки для того чтобы сделать все нужные мне фильтры или же можно сделать все в пределах одного класса? Потому-что я вот пробовал создавать еще один метод compare для других параметров и у меня не получилось.

Может у кого-то есть более нормальный метод сортировки списка, буду рад если любым советам и помощи.

Answer 1
  • Да, вам лучше будет создать разные классы для разных сортировок.
  • Если вам надо сортировать по нескольким полям за раз, то можно использовать: thenComparing. Вот примерный код:

    import java.util.ArrayList;
    import java.util.Comparator;
    class Person {
        int age;
        String name;
        @Override
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    class CompareByAll implements Comparator<Person>{
        @Override
        public int compare(Person o1, Person o2) {
            return o1.age - o2.age;
        }
    }
    class CompareByName implements Comparator<Person>{
        @Override
        public int compare(Person o1, Person o2) {
            return o1.name.compareTo(o2.name);
        }
    }
    
    public class teTCompare {
        public static void main(String[] args) {
            teTCompare qwe = new teTCompare();
            Person p1 = new Person();
            p1.age = 10;
            p1.name = "123";
            Person p2 = new Person();
            p2.age = 10;
            p2.name = "223";
            Person p3 = new Person();
            p3.age = 10;
            p3.name = "323";
            Person p4 = new Person();
            p4.age = 10;
            p4.name = "023";
            Person p5 = new Person();
            p5.age = 50;
            p5.name = "-123";
            ArrayList<Person> asd = new ArrayList<>(5);
            asd.addAll(Arrays.asList(p1, p2, p3, p4, p5));
            asd.sort(new CompareByAll().thenComparing(new CompareByName()));
            System.out.println(asd);
        }
    }

Результат будет:

[Person{age=10, name='023'}, Person{age=10, name='123'}, Person{age=10, name='223'}, Person{age=10, name='323'}, Person{age=50, name='-123'}]
READ ALSO
Как правильно обработать на Java входящий JSON?

Как правильно обработать на Java входящий JSON?

Как делать запросы и их обрабатывать - я разобрался

162
Непонятная проблема с выбором элемента spinner Android

Непонятная проблема с выбором элемента spinner Android

Пытаюсь внедрить spinner у себя в приложенииВ списке есть три пункта, и по непонятной мне причине воспринимается выбор только 2,3 если начинать...

205
Как напечатать буквы в консоле через звездочки?

Как напечатать буквы в консоле через звездочки?

Есть 3 буквы на входе "А В В" Нужно вывести в консоль? Так должна выглядеть буква

211
Не подключаются несколько событий onTextChanged на каждый EditText

Не подключаются несколько событий onTextChanged на каждый EditText

Когда я пытаюсь присвоить одно событие onTextChanged к одному EditText, чтобы значение из этого EditText записалось в другой EditText, всё работает хорошоНо...

207