Android-java - Як сортувати список об'єктів за певним значенням усередині об’єкта


112

Я намагаюся розібратися через масив об’єктів за певним значенням всередині об'єкта. Який був би найкращий підхід зробити таке. Чи варто використовувати Collections.sort () з якимось компаратором?

Я намагаюся сортувати список об'єктів за допомогою плаваючого значення, яке вони містять в одній із змінних.

EDIT: Ось що я маю досі:

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

стани помилки: Неможливо викликати параметр CompareTo (подвійний) на примітивному типі double.

Це тому, що компаратор не може повернути щось, крім певного типу?


2
"Чи варто використовувати Collections.sort () з якимось компаратором? Так, це звучить як гарна ідея
Кеннет

Я не знаю, чи це має значення, але кількість об'єктів у списку буде дорівнює 80. Ось чому я збентежився з приводу використання компаратора, якщо це шлях, тому що він порівнює лише два значення одразу.
Джеймс андресакіс

Ось так працює сортування. Спочатку додайте один елемент до списку. При додаванні наступного; Якщо це має відбутися до або після поточного в списку. При додаванні третього елемента порівняйте з першим елементом у списку, якщо після цього порівняйте із наступним. І так далі.
Кеннет

Відповіді:


98

Ви повинні використовувати Comparable замість компаратора, якщо сортування за замовчуванням - це те, що ви шукаєте.

Дивіться тут, це може бути корисною - Коли клас повинен бути порівнянним та / або порівняльним?

Спробуйте це -

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;
    }
}

Ей, дякую за посилання :) Я переходжу назад і вперед від однієї мови до наступної, так що я завжди щось пропускаю: p, ти знаєш, як це йде ...... джек всіх торгів, але майстер нічого не лол
Джеймс andresakis

365

Дотримуйтесь цього коду, щоб сортувати будь-який 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
        }
    });

16
Це має бути головна відповідь!
Джон Сміт

3
проста і чудова відповідь, кудо брато :)
Садашів

1
Просте і маленьке .. Дякую!
Зустрінься з Ворою

1
Це здається справді чистим. Дякую. І один плюс за надані поради.
Анураг

2
Робота лише для API 24 і вище
Темеліс,

42

Я думаю, що це допоможе тобі краще

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());
    }
});

24

Тепер немає необхідності в боксі (тобто немає потреби в творенні OBJECT за допомогою нового оператора, використовуваного значенняOf insted with 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

"Android-java" тут нічим не відрізняється від "звичайної Java", так що так Collections.sort()було б хорошим підходом.


1
Але як змусити його сортувати за значенням усередині об’єкта. Ось що я застряг.
Джеймс андресакіс

2
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

Ви можете порівняти дві рядки, скориставшись цією.

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;

}
}

Ось список контактів:

public static ArrayList<ContactsData> contactsList = new ArrayList<ContactsData>();

1

Або зробіть такий, Comparatorякий може порівнювати ваші об'єкти, або якщо вони всі екземпляри одного класу, ви можете зробити цей клас реалізацією Comparable. Потім можна використовувати Collections.sort (), щоб зробити власне сортування.


Я продовжував і впроваджував у своєму класі Порівняльний, але створив метод для виклику сортування у списку, коли мені потрібно буде його сортувати, але як сортувати його за значенням у об’єкті?
Джеймс андресакіс

Метод compareTo()- це те, де ви робите порівняння. Невеликий googling дав кілька детальних прикладів того, як його використовувати, ось один із них: javadeveloper.co.in/java-example/java-comparable-example.html
Jave

Я встановив метод, подібний до прикладу, однак я отримую помилку, що я не можу використовувати CompareTo на подвійному ролі. Схоже, з будь-якої причини, що я роблю це, не подобається. Неможливо викликати CompareTo (подвійний) для примітивного типу double. Я додаю свій код вище, щоб показати, що я маю на увазі
Джеймс andresakis

1

Для Котліна ви можете використовувати цю функцію

fun sortList(list: List<YourCustomPOJOClass?>) {

    //descending
    Collections.sort(
        list
    ) { o1, o2 -> Integer.valueOf(o1!!.intValueXYZ!!).compareTo(o2!!.intValueXYZ!!) }

//    //ascending
//    Collections.sort(
//        list
//    ) { o1, o2 -> Integer.valueOf(o2!!.intValueXYZ!!).compareTo(o1!!.intValueXYZ!!) }
}

і просто зателефонуйте йому у свій activityабо fragmentвід

sortList(list)

0

У мене є перегляд списку, в якому відображається інформація про всіх клієнтів, які я сортую ім'я клієнтів, використовуючи цей спеціальний клас порівняння. Окрім англійських букв, якими я керую за допомогою цього наборуStrength (Collator.SECONDARY), у них є додатковий леррет

 public class CustomNameComparator implements Comparator<ClientInfo> {
        @Override

    public int compare(ClientInfo o1, ClientInfo o2) { 

        Locale locale=Locale.getDefault();
        Collator collator = Collator.getInstance(locale);
        collator.setStrength(Collator.SECONDARY);
        return collator.compare(o1.title, o2.title);

    }
}


PRIMARY strength: Typically, this is used to denote differences between base characters (for example, "a" < "b"). It is the strongest difference. For example, dictionaries are divided into different sections by base character. 
SECONDARY strength: Accents in the characters are considered secondary differences (for example, "as" < "às" < "at"). Other differences between letters can also be considered secondary differences, depending on the language. A secondary difference is ignored when there is a primary difference anywhere in the strings. 
TERTIARY strength: Upper and lower case differences in characters are distinguished at tertiary strength (for example, "ao" < "Ao" < "aò"). In addition, a variant of a letter differs from the base form on the tertiary strength (such as "A" and "Ⓐ"). Another example is the difference between large and small Kana. A tertiary difference is ignored when there is a primary or secondary difference anywhere in the strings. 
IDENTICAL strength: When all other strengths are equal, the IDENTICAL strength is used as a tiebreaker. The Unicode code point values of the NFD form of each string are compared, just in case there is no difference. For example, Hebrew cantellation marks are only distinguished at this strength. This strength should be used sparingly, as only code point value differences between two strings are an extremely rare occurrence. Using this strength substantially decreases the performance for both comparison and collation key generation APIs. This strength also increases the size of the collation key. 

**Here is a another way to make a rule base sorting if u need it just sharing**

/*      String rules="< å,Å< ä,Ä< a,A< b,B< c,C< d,D< é< e,E< f,F< g,G< h,H< ï< i,I"+"< j,J< k,K< l,L< m,M< n,N< ö,Ö< o,O< p,P< q,Q< r,R"+"< s,S< t,T< ü< u,U< v,V< w,W< x,X< y,Y< z,Z";
        RuleBasedCollator rbc = null;
        try {
            rbc = new RuleBasedCollator(rules);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String myTitles[]={o1.title,o2.title};
        Collections.sort(Arrays.asList(myTitles), rbc);*/

0

Клас моделі:

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

Резюме: Це буде сортувати ваші дані по даті


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.