Android-java - Как отсортировать список объектов по определенному значению внутри объекта - PullRequest
93 голосов
/ 02 февраля 2012

Я пытаюсь отсортировать массив объектов по определенному значению в объекте.Что было бы лучшим подходом, чтобы сделать такую ​​вещь.Должен ли я использовать Collections.sort () с каким-то компаратором?

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

РЕДАКТИРОВАТЬ: Это то, что я до сих пор:

public class CustomComparator implements Comparator<Marker> {
    @Override
    public int compare(Mark o1, Mark o2) {
        return o1.getDistance().compareTo(o2.getDistance());
    }
}

ошибка гласит: Невозможно вызвать compareTo (double) для типа примитива double.

Это потому, что компаратор не может вернуть ничего, кроме определенного типа?

Ответы [ 11 ]

313 голосов
/ 11 декабря 2012

Следуйте этому коду для сортировки любого ArrayList

Collections.sort(myList, new Comparator<EmployeeClass>(){
    public int compare(EmployeeClass obj1, EmployeeClass obj2) {
        // ## Ascending order
        return obj1.firstName.compareToIgnoreCase(obj2.firstName); // To compare string values
        // return Integer.valueOf(obj1.empId).compareTo(Integer.valueOf(obj2.empId)); // To compare integer values

        // ## Descending order
        // return obj2.firstName.compareToIgnoreCase(obj1.firstName); // To compare string values
        // return Integer.valueOf(obj2.empId).compareTo(Integer.valueOf(obj1.empId)); // To compare integer values
        }
    });
89 голосов
/ 02 февраля 2012

Вы должны использовать Comparable вместо Comparator, если сортировка по умолчанию - это то, что вы ищете.

Смотрите здесь, это может быть чем-то полезно - Когда класс должен быть Comparable и / или Comparator?

Попробуйте это -

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestSort {

    public static void main(String args[]){

        ToSort toSort1 = new ToSort(new Float(3), "3");
        ToSort toSort2 = new ToSort(new Float(6), "6");
        ToSort toSort3 = new ToSort(new Float(9), "9");
        ToSort toSort4 = new ToSort(new Float(1), "1");
        ToSort toSort5 = new ToSort(new Float(5), "5");
        ToSort toSort6 = new ToSort(new Float(0), "0");
        ToSort toSort7 = new ToSort(new Float(3), "3");
        ToSort toSort8 = new ToSort(new Float(-3), "-3");

        List<ToSort> sortList = new ArrayList<ToSort>();
        sortList.add(toSort1);
        sortList.add(toSort2);
        sortList.add(toSort3);
        sortList.add(toSort4);
        sortList.add(toSort5);
        sortList.add(toSort6);
        sortList.add(toSort7);
        sortList.add(toSort8);

        Collections.sort(sortList);

        for(ToSort toSort : sortList){
            System.out.println(toSort.toString());
        }
    }

}

public class ToSort implements Comparable<ToSort> {

    private Float val;
    private String id;

    public ToSort(Float val, String id){
        this.val = val;
        this.id = id;
    }

    @Override
    public int compareTo(ToSort f) {

        if (val.floatValue() > f.val.floatValue()) {
            return 1;
        }
        else if (val.floatValue() <  f.val.floatValue()) {
            return -1;
        }
        else {
            return 0;
        }

    }

    @Override
    public String toString(){
        return this.id;
    }
}
40 голосов
/ 02 февраля 2012

Я думаю, это поможет вам лучше

Person p = new Person("Bruce", "Willis");
Person p1  = new Person("Tom", "Hanks");
Person p2 = new Person("Nicolas", "Cage");
Person p3 = new Person("John", "Travolta");

ArrayList<Person> list = new ArrayList<Person>();
list.add(p);
list.add(p1);
list.add(p2);
list.add(p3);

Collections.sort(list, new Comparator() {
    @Override
    public int compare(Object o1, Object o2) {
        Person p1 = (Person) o1;
        Person p2 = (Person) o2;
        return p1.getFirstName().compareToIgnoreCase(p2.getFirstName());
    }
});
22 голосов
/ 18 сентября 2015

Теперь нет необходимости в боксе (т.е. не нужно создавать OBJECT с использованием нового оператора, используйте valueOf, вставленное с CompareTo of Collections.Sort ..)

1) Для возрастающего порядка

Collections.sort(temp, new Comparator<XYZBean>() 
{
     @Override
     public int compare(XYZBean lhs, XYZBean rhs) {

       return Integer.valueOf(lhs.getDistance()).compareTo(rhs.getDistance());
      }
 });

1) Для убывающего заказа

Collections.sort(temp, new Comparator<XYZBean>() 
{
     @Override
     public int compare(XYZBean lhs, XYZBean rhs) {

       return Integer.valueOf(rhs.getDistance()).compareTo(lhs.getDistance());
      }
 });
2 голосов
/ 29 декабря 2018

Это очень просто для Котлина!

listToBeSorted.sortBy { it.distance }

2 голосов
/ 16 октября 2014

Вы можете сравнить две строки, используя это.

Collections.sort(contactsList, new Comparator<ContactsData>() {

                    @Override
                    public int compare(ContactsData lhs, ContactsData rhs) {

                        char l = Character.toUpperCase(lhs.name.charAt(0));

                        if (l < 'A' || l > 'Z')

                            l += 'Z';

                        char r = Character.toUpperCase(rhs.name.charAt(0));

                        if (r < 'A' || r > 'Z')

                            r += 'Z';

                        String s1 = l + lhs.name.substring(1);

                        String s2 = r + rhs.name.substring(1);

                        return s1.compareTo(s2);

                    }

                });

И теперь создайте класс ContactData.

public class ContactsData {

public String name;
public String id;
public String email;
public String avatar; 
public String connection_type;
public String thumb;
public String small;
public String first_name;
public String last_name;
public String no_of_user;
public int grpIndex;

public ContactsData(String name, String id, String email, String avatar, String connection_type)
{
    this.name = name;
    this.id = id;
    this.email = email;
    this.avatar = avatar;
    this.connection_type = connection_type;

}
}

Здесь contactsList:

public static ArrayList<ContactsData> contactsList = new ArrayList<ContactsData>();
2 голосов
/ 08 августа 2013
public class DateComparator implements Comparator<Marker> {
    @Override
    public int compare(Mark lhs, Mark rhs) {
        Double distance = Double.valueOf(lhs.getDistance());
        Double distance1 = Double.valueOf(rhs.getDistance());
        if (distance.compareTo(distance1) < 0) {
            return -1;
        } else if (distance.compareTo(distance1) > 0) {
            return 1;
        } else {
            return 0;
        }
    }
}

ArrayList(Marker) arraylist;

Как использовать:

Collections.sort(arraylist, new DateComparator());
2 голосов
/ 02 февраля 2012

«Android-java» здесь ничем не отличается от «нормальной java», так что да, Collections.sort() будет хорошим подходом.

1 голос
/ 02 февраля 2012

Либо создайте Comparator, который может сравнивать ваши объекты, либо, если они все являются экземплярами одного и того же класса, вы можете заставить этот класс реализовать Comparable. Затем вы можете использовать Collections.sort () для реальной сортировки.

0 голосов
/ 28 апреля 2015

Класс модели:

public class ToDoModel implements Comparable<ToDoModel> {
    private String id;
    private Date taskDate;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Date getTaskDate() {
        return taskDate;
    }

    public void setTaskDate(Date taskDate) {
        this.taskDate = taskDate;
    }

    @Override
    public int compareTo(ToDoModel another) {
        return getTaskDate().compareTo(another.getTaskDate());  
    }
}

Теперь установите данные в ArrayList

for (int i = 0; i < your_array_length; i++) {
    ToDoModel tm = new ToDoModel();
    tm.setId(your_id);
    tm.setTaskDate(your_date);
    mArrayList.add(tm);
}

Теперь сортировать ArrayList

Collections.sort(toDoList);

Краткое содержание: данные будут отсортированы по дате

...