Android-java- วิธีจัดเรียงรายการของวัตถุตามค่าที่แน่นอนภายในวัตถุ


112

ฉันกำลังพยายามจัดเรียงรายการอาร์เรย์ของวัตถุตามค่าเฉพาะภายในวัตถุ อะไรคือแนวทางที่ดีที่สุดในการทำสิ่งนั้น ฉันควรใช้ 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

เป็นเพราะตัวเปรียบเทียบไม่สามารถส่งคืนสิ่งอื่นนอกเหนือจากบางประเภทได้หรือไม่?


2
"ฉันควรใช้ Collections.sort () กับตัวเปรียบเทียบบางประเภทหรือไม่" ใช่ฟังดูเหมือนเป็นความคิดที่ดี
Kennet

ฉันไม่รู้ว่ามันมีความสำคัญหรือไม่ แต่จำนวนของวัตถุในรายการจะสูงถึง 80 นั่นเป็นเหตุผลที่ทำให้ฉันสับสนเกี่ยวกับการใช้ตัวเปรียบเทียบว่าเป็นวิธีที่จะไปเพราะมันเปรียบเทียบสองค่าพร้อมกันเท่านั้น
James andresakis

นั่นคือวิธีการทำงานของการเรียงลำดับ ขั้นแรกให้เพิ่มหนึ่งรายการในรายการ เมื่อเพิ่มถัดไป สิ่งนี้ควรไปก่อนหรือหลังปัจจุบันในรายการ เมื่อเพิ่มรายการที่สามเปรียบเทียบกับรายการแรกในรายการถ้าหลังจากนั้นเปรียบเทียบกับรายการถัดไป และอื่น ๆ
Kennet

คำตอบ:


98

คุณควรใช้การเปรียบเทียบแทนการเปรียบเทียบหากการจัดเรียงเริ่มต้นคือสิ่งที่คุณต้องการ

ดูที่นี่นี่อาจเป็นประโยชน์บางประการ - เมื่อใดควรเปรียบเทียบชั้นเรียนและ / หรือตัวเปรียบเทียบ

ลองสิ่งนี้ -

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

สวัสดีขอบคุณสำหรับการเชื่อมโยง :) ฉันกลับไปกลับมาจากภาษาหนึ่งไปอีกภาษาหนึ่งดังนั้นฉันจึงพลาดบางสิ่งบางอย่างเสมอ: คุณรู้ไหมว่ามันเป็นอย่างไร ...... แจ็คของการค้าทั้งหมด แต่ไม่มีผู้เชี่ยวชาญ lol
James andresakis

366

ทำตามรหัสนี้เพื่อจัดเรียง 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
        }
    });

17
นี่น่าจะเป็นคำตอบอันดับต้น ๆ !
John Smith

3
คำตอบที่เรียบง่ายและยอดเยี่ยม kudos bro :)
Sadashiv

1
เรียบง่ายและเล็ก .. ขอบคุณ!
พบกับ Vora

1
นี่ดูเหมือนสะอาดจริงๆ ขอบคุณ. และ One plus สำหรับเคล็ดลับที่ให้มา
Anurag

3
ทำงานสำหรับ API 24 ขึ้นไปเท่านั้น
Themelis

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โดยใช้ Operator ใหม่ให้ใช้ valueOf ที่ติดตั้งด้วย CompareTo of Collections เรียงลำดับ .. )

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
แต่ฉันจะจัดเรียงตามค่าภายในวัตถุได้อย่างไร นั่นคือสิ่งที่ฉันติดอยู่
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;

วิธีใช้:

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

2

คุณสามารถเปรียบเทียบสอง String ได้โดยใช้สิ่งนี้

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;

}
}

ที่นี่ contactList คือ:

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

1

ไม่ว่าจะสร้างComparatorที่สามารถเปรียบเทียบวัตถุของคุณหรือถ้าเป็นอินสแตนซ์ทั้งหมดของคลาสเดียวกันคุณสามารถทำให้คลาสนั้นใช้งานComparableได้ จากนั้นคุณสามารถใช้ Collections.sort () เพื่อทำการเรียงลำดับจริง


ฉันดำเนินการต่อและนำการเทียบเคียงไปใช้ในชั้นเรียนของฉัน แต่และสร้างวิธีการเรียกการจัดเรียงในรายการเมื่อฉันต้องการจัดเรียง แต่ฉันจะเรียงลำดับตามค่าในวัตถุได้อย่างไร
James andresakis

compareTo()-method เป็นที่ที่คุณทำเปรียบเทียบ googling เล็กน้อยให้ตัวอย่างโดยละเอียดเกี่ยวกับวิธีการใช้งานนี่คือหนึ่งในนั้น: javadeveloper.co.in/java-example/java-comparable-example.html
Jave

ฉันตั้งค่าวิธีการที่คล้ายกับตัวอย่าง แต่ฉันได้รับข้อผิดพลาดที่ระบุว่าฉันไม่สามารถใช้ CompareTo ในการร่ายสองครั้งได้ ดูเหมือนว่าด้วยเหตุผลอะไรสิ่งที่ฉันทำมันไม่ชอบ ไม่สามารถเรียกใช้ CompareTo (double) ในประเภท primitive double ฉันเพิ่มรหัสของฉันไว้ด้านบนเพื่อแสดงว่าฉันหมายถึงอะไร
James andresakis

1

คลาสรุ่น:

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

สรุป: จะจัดเรียงข้อมูลของคุณ


1

สำหรับKotlinคุณสามารถใช้ฟังก์ชันนี้ได้

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

ฉันมี listview ซึ่งแสดงข้อมูลเกี่ยวกับไคลเอนต์ทั้งหมดที่ฉันกำลังเรียงลำดับชื่อไคลเอนต์โดยใช้คลาสตัวเปรียบเทียบที่กำหนดเองนี้ พวกเขามี lerret พิเศษนอกเหนือจากตัวอักษรภาษาอังกฤษที่ฉันจัดการกับ setStrength (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);*/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.