카테고리 보관물: Java

Java

Android-java- 객체 내 특정 값으로 객체 목록을 정렬하는 방법 지금까지 가지고있는 것입니다. public class CustomComparator

개체 내의 특정 값으로 개체의 배열 목록을 정렬하려고합니다. 그런 일을하는 가장 좋은 방법은 무엇일까요. 어떤 종류의 비교기와 함께 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)을 호출 할 수 없습니다.

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



답변

기본 정렬이 원하는 경우 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;
    }
}


답변

이 코드를 따라 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
        }
    });


답변

나는 이것이 당신을 더 잘 도울 것이라고 생각합니다

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


답변

이제 복싱 할 필요가 없습니다 (즉 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());
      }
 });


답변

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


답변

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


답변

이것을 사용하여 두 개의 문자열을 비교할 수 있습니다.

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