Android-java-オブジェクトのリストをオブジェクト内の特定の値でソートする方法


112

オブジェクト内の特定の値でオブジェクトの配列リストをソートしようとしています。そのようなことをするための最良のアプローチは何でしょうか。ある種のコンパレータでCollections.sort()を使用する必要がありますか?

オブジェクトのリストを、変数の1つに保持されているfloat値でソートしようとしています。

編集:これは私がこれまでに持っているものです:

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()をある種のコンパレータと一緒に使用すべきでしょうか?」はい、いい考えのよう
ケネット

それが重要かどうかはわかりませんが、リスト内のオブジェクトの数は80に達します。2つの値を一度に比較するだけなので、コンパレーターの使用が混乱する理由です。
James andresakis

これがソートの仕組みです。まず、リストにアイテムを1つ追加します。次に追加する場合; これは、リスト内の電流の前または後に移動する必要があります。3番目のアイテムを追加するときに、リストの最初のアイテムと比較します。その後、次のアイテムと比較します。等々。
ケネット

回答:


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あなたはそれがどうなるか知っています......すべての取引のジャックですが、どれもマスターではありませんlol
James 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
これが一番の答えになるはずです!
John Smith、

3
シンプルで素晴らしい答え、kudos bro :)
Sadashiv

1
シンプルで小さい..ありがとう!
Vora

1
これは本当にきれいに見えます。ありがとう。そして、提供されたヒントのための1つのプラス。
Anurag 2016

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 instedを使用します。)

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

これを使用して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;

}
}

ここでcontactsListは:

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

1

Comparatorオブジェクトを比較できるを作成するか、それらがすべて同じクラスのインスタンスである場合は、そのクラスにを実装させることができますComparable。次に、Collections.sort()を使用して実際のソートを実行できます。


私は先に進んでクラスにComparableを実装しましたが、並べ替える必要があるときにリストでsortを呼び出すメソッドを作成しましたが、オブジェクト内の値でどのように並べ替えますか?
James andresakis

- compareTo()メソッドは、比較を行う場所です。少しグーグルでそれを使用する方法のいくつかの詳細な例を示しました、ここにそれらの1つがあります:javadeveloper.co.in/java-example/java-comparable-example.html
Jave

例と同様のメソッドを設定しましたが、キャストdoubleでcompareToを使用できないというエラーが表示されます。それはどんな理由であれ、イムがやっていることは好きではないようです。プリミティブ型doubleでcompareTo(double)を呼び出すことはできません。上記のコードを追加して、私が何を意味するかを示します
James andresakis

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

そしてちょうどあなたにそれを呼び出すactivityfragmentによって、

sortList(list)

0

このカスタムコンパレータクラスを使用してクライアント名をソートしているすべてのクライアントに関する情報を表示するリストビューがあります。彼らは私がこのsetStrength(Collat​​or.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);

概要:データを日付順に並べ替えます


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.