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

오류 상태 : 기본 유형 double에서 compareTo (double)을 호출 할 수 없습니다.

비교기가 특정 유형 이외의 것을 반환 할 수 없기 때문입니까?


2
"비교기의 어떤 종류해야 내가 사용은, Collections.sort ()?"네, 좋은 아이디어 같은 소리
Kennet

중요한지 모르겠지만 목록에있는 개체의 수는 80 개가 될 것입니다. 그래서 한 번에 두 값만 비교하기 때문에 비교기를 사용하는 것에 대해 Im이 혼란스러워하는 이유입니다.
James andresakis 2012

이것이 정렬이 작동하는 방식입니다. 먼저 목록에 하나의 항목을 추가하십시오. 다음을 추가 할 때; 이것이 목록에서 현재 이전 또는 이후에 진행되어야합니다. 세 번째 항목을 추가 할 때 목록의 첫 번째 항목과 비교 한 후 다음 항목과 비교합니다. 등등.
Kennet

답변:


98

기본 정렬이 원하는 경우 Comparator 대신 Comparable을 사용해야합니다.

여기를 참조하십시오. 이것은 도움이 될 수 있습니다 . 클래스는 언제 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;
    }
}

안녕하세요 덕분에 링크 : 임 항상 뭔가 빠진 그래서 하나 개의 언어에서 다음 앞뒤로 이동을 위해 : 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
간단하고 훌륭한 대답, 명성 형제 :
Sadashiv

1
간단하고 작은 .. 감사합니다!
Vora 만나기

1
이것은 정말 깨끗해 보입니다. 감사. 그리고 제공된 팁에 대한 하나의 플러스.
Anurag

2
작품은 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, Collections.Sort ..의 compareTo와 함께 valueOf를 사용하여 새 연산자를 사용하여 생성 할 필요가 없습니다 .)

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

"안드로이드-자바"는 "일반 자바"와 전혀 다르지 않으므로 예가 Collections.sort()좋은 접근 방식이 될 것입니다.


1
그러나 객체 내의 값을 기준으로 정렬하려면 어떻게해야합니까? 그게 내가 붙어있는 것입니다.
James andresakis 2012

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 ()를 사용하여 실제 정렬을 수행 할 수 있습니다.


계속해서 내 클래스에서 Comparable을 구현했지만 정렬해야 할 때 목록에서 sort를 호출하는 메서드를 만들었지 만 개체의 값으로 정렬하려면 어떻게해야합니까?
James andresakis 2012

compareTo()는 비교를 할 경우 -method이다. 약간의 인터넷 검색을 통해 사용 방법에 대한 몇 가지 자세한 예제를 제공했습니다. 여기에 그 중 하나가 있습니다. javadeveloper.co.in/java-example/java-comparable-example.html
Jave

예제와 유사한 방법을 설정했지만 캐스트 double에서 compareTo를 사용할 수 없다는 오류가 발생합니다. 어떤 이유로 든, 내가하는 일이 싫어하는 것 같습니다. 기본 유형 double에서 compareTo (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

들어 코 틀린 ,이 기능을 사용할 수 있습니다

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

이 사용자 지정 비교기 클래스를 사용하여 클라이언트 이름을 정렬하는 모든 클라이언트에 대한 정보를 보여주는 목록보기가 있습니다. 그들은 내가이 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.