Android-java- Cách sắp xếp danh sách các đối tượng theo một giá trị nhất định trong đối tượng


112

Tôi đang cố gắng sắp xếp thông qua danh sách mảng các đối tượng theo một giá trị cụ thể trong đối tượng. Cách tiếp cận tốt nhất để làm điều đó là gì. Tôi có nên sử dụng Collections.sort () với một số loại so sánh không?

Tôi đang cố gắng sắp xếp danh sách các đối tượng theo một giá trị float mà chúng chứa trong một trong các biến.

CHỈNH SỬA: Đây là những gì tôi có cho đến nay:

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

lỗi trạng thái: Không thể gọi hàm so sánh (double) trên kiểu nguyên thủy double.

Có phải vì bộ so sánh không thể trả về bất kỳ thứ gì khác ngoài một kiểu nhất định không?


2
"Tôi có nên sử dụng Collections.sort () với một số loại so sánh không?" Vâng, nghe có vẻ là một ý kiến ​​hay
Kennet

Tôi không biết liệu nó có quan trọng không nhưng số lượng đối tượng trong danh sách sẽ cao tới 80. Đó là lý do tại sao tôi hơi bối rối về việc sử dụng một bộ so sánh nếu đó là cách để đi vì nó chỉ so sánh hai giá trị cùng một lúc.
James andresakis

Đó là cách sắp xếp hoạt động. Đầu tiên hãy thêm một mục vào danh sách. Khi thêm tiếp theo; điều này nên đi trước hoặc sau hiện tại trong danh sách. Khi thêm mục thứ ba, hãy so sánh với mục đầu tiên trong danh sách, nếu sau đó thì so sánh với mục tiếp theo. Và như thế.
Kennet

Câu trả lời:


98

Bạn nên sử dụng So sánh thay vì So sánh nếu một loại mặc định là thứ bạn đang tìm kiếm.

Xem ở đây, điều này có thể hữu ích - Khi nào thì một lớp là So sánh và / hoặc So sánh?

Thử cái này -

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

Này, cảm ơn vì liên kết :) Tôi quay đi quay lại từ ngôn ngữ này sang ngôn ngữ khác nên tôi luôn thiếu một thứ gì đó: p bạn biết nó diễn ra như thế nào không ...... jack của tất cả các ngành nghề nhưng không có bậc thầy nào lol
James andresakis

365

Làm theo mã này để sắp xếp bất kỳ ArrayList nào

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
Đây phải là câu trả lời hàng đầu!
John Smith

3
câu trả lời đơn giản và tuyệt vời, kudos bro :)
Sadashiv

1
Đơn giản và nhỏ .. Cảm ơn!
Gặp gỡ Vora

1
Điều này có vẻ thực sự sạch sẽ. cảm ơn. Và Một điểm cộng cho các mẹo được cung cấp.
Anurag

2
Công việc chỉ dành cho API 24 trở lên
Themelis

42

Tôi nghĩ điều này sẽ giúp bạn tốt hơn

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

Bây giờ không cần Boxing (tức là không cần Tạo OBJECTbằng cách sử dụng Toán tử mới valueOf được chèn với so sánhTo của Bộ sưu tập. Sắp xếp ..)

1) Đối với thứ tự tăng dần

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

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

1) Đối với thứ tự giảm dần

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" ở đây không khác gì "java bình thường", vì vậy có Collections.sort()sẽ là một cách tiếp cận tốt.


1
Nhưng làm cách nào để tôi sắp xếp nó theo một giá trị trong đối tượng. Đó là những gì tôi mắc kẹt trên.
James andresakis

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;

Cách sử dụng:

Collections.sort(arraylist, new DateComparator());

2

Bạn có thể so sánh hai chuỗi bằng cách sử dụng điều này.

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

                    }

                });

Và Bây giờ tạo một Lớp Dữ liệu Liên hệ.

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;

}
}

Danh sách liên hệ đây là:

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

1

Tạo một Comparatorcó thể so sánh các đối tượng của bạn hoặc nếu chúng là tất cả các cá thể của cùng một lớp, bạn có thể thực hiện lớp đó Comparable. Sau đó, bạn có thể sử dụng Collections.sort () để thực hiện việc sắp xếp thực tế.


Tôi đã tiếp tục và triển khai So sánh trong lớp của mình nhưng và tạo một phương thức để gọi sắp xếp trên danh sách khi tôi cần sắp xếp nó nhưng làm cách nào để sắp xếp nó theo một giá trị trong đối tượng?
James andresakis

Các compareTo()-method là nơi bạn làm việc so sánh. Một googling nhỏ đã đưa ra một số ví dụ chi tiết về cách sử dụng nó, đây là một trong số chúng: javadeveloper.co.in/java-example/java-compitable-example.html
Jave

Tôi đã thiết lập một phương thức tương tự như ví dụ này, tuy nhiên, tôi gặp lỗi cho biết tôi không thể sử dụng CompareTo trên một bộ đôi truyền. Có vẻ như vì lý do gì, tôi đang làm nó không thích. Không thể gọi hàm so sánh (double) trên kiểu nguyên thủy double. Tôi sẽ thêm mã của tôi lên trên để hiển thị ý tôi
James andresakis

1

Lớp mô hình:

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

Bây giờ đặt dữ liệu trong 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);
}

Bây giờ Sắp xếp ArrayList

Collections.sort(toDoList);

Tóm tắt: Nó sẽ sắp xếp dữ liệu của bạn theo ngày tháng


1

Đối với Kotlin , bạn có thể sử dụng chức năng này

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!!) }
}

và chỉ cần gọi nó trong của bạn activityhoặc fragmentbằng

sortList(list)

0

Tôi có một chế độ xem danh sách hiển thị Thông tin về tất cả khách hàng mà tôi đang sắp xếp tên khách hàng bằng cách sử dụng lớp so sánh tùy chỉnh này. Họ đang có một số lerret bổ sung ngoài các chữ cái tiếng Anh mà tôi đang quản lý với bộ nàyStrength (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);*/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.