Android-java- So sortieren Sie eine Liste von Objekten nach einem bestimmten Wert innerhalb des Objekts

111

Ich versuche, eine Arrayliste von Objekten nach einem bestimmten Wert innerhalb des Objekts zu sortieren. Was wäre der beste Ansatz, um so etwas zu tun? Sollte ich Collections.sort () mit einer Art Komparator verwenden?

Ich versuche, eine Liste von Objekten nach einem Gleitkommawert zu sortieren, den sie in einer der Variablen enthalten.

EDIT: Das habe ich bisher:

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

Der Fehler lautet: Beim Vergleich des primitiven Typs double kann compareTo (double) nicht aufgerufen werden.

Liegt es daran, dass ein Komparator nichts anderes als einen bestimmten Typ zurückgeben kann?

James andresakis
quelle
2
"Soll ich Collections.sort () mit einer Art Komparator verwenden?" Ja, klingt nach einer guten Idee
Kennet
Ich weiß nicht, ob es wichtig ist, aber die Anzahl der Objekte in der Liste wird bis zu 80 betragen. Deshalb bin ich etwas verwirrt über die Verwendung eines Komparators, wenn dies der richtige Weg ist, da nur zwei Werte gleichzeitig verglichen werden.
James Andresakis
So funktioniert das Sortieren. Fügen Sie zunächst einen Eintrag zu einer Liste hinzu. Beim nächsten Hinzufügen; sollte dies vor oder nach aktuell in der Liste gehen. Wenn Sie ein drittes Element hinzufügen, vergleichen Sie es mit dem ersten Element in der Liste. Wenn danach, vergleichen Sie es mit dem nächsten Element. Und so weiter.
Kennet

Antworten:

98

Sie sollten Comparable anstelle eines Comparators verwenden, wenn Sie nach einer Standardsortierung suchen.

Siehe hier, dies kann hilfreich sein - Wann sollte eine Klasse vergleichbar und / oder vergleichend sein?

Versuche dies -

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;
    }
}
blauer Himmel
quelle
Hey, danke für den Link :) Ich gehe von einer Sprache zur nächsten hin und her, damit mir immer etwas fehlt: p du weißt wie es geht ......
Alleskönner,
365

Befolgen Sie diesen Code, um eine beliebige ArrayList zu sortieren

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
        }
    });
Atif Mahmood
quelle
16
Dies sollte die beste Antwort sein!
John Smith
3
einfache & tolle Antwort, ein dickes Lob, Bruder :)
Sadashiv
1
Einfach und klein .. Danke!
Treffen Sie Vora
1
Das scheint wirklich sauber zu sein. Vielen Dank. Und ein Plus für die bereitgestellten Tipps.
Anurag
2
Arbeit ist nur für API 24 und höher
Themelis
42

Ich denke, das wird dir besser helfen

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());
    }
});
Ramesh Solanki
quelle
24

Jetzt muss nicht OBJECTmehr geboxt werden (dh es muss nicht mehr mit einem neuen Operator erstellt werden. Verwenden Sie valueOf, das mit compareTo of Collections.Sort .. installiert wurde.)

1) Bei aufsteigender Reihenfolge

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

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

1) Bei absteigender Reihenfolge

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

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

"Android-Java" unterscheidet sich hier keineswegs von "normalem Java", also Collections.sort()wäre ja ein guter Ansatz.

Heiko Rupp
quelle
1
Aber wie kann ich es nach einem Wert innerhalb des Objekts sortieren lassen? Darauf bin ich fixiert.
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;

Wie benutzt man:

Collections.sort(arraylist, new DateComparator());
Ketan Mehta
quelle
2

Sie können zwei Zeichenfolgen damit vergleichen.

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

                    }

                });

Und jetzt machen Sie eine ContactData-Klasse.

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;

}
}

Hier ist die Kontaktliste:

public static ArrayList<ContactsData> contactsList = new ArrayList<ContactsData>();
Ankit Sharma
quelle
1

Erstellen Sie entweder eine Comparator, die Ihre Objekte vergleichen kann, oder wenn alle Instanzen derselben Klasse sind, können Sie diese Klasse implementieren lassen Comparable. Sie können dann Collections.sort () verwenden, um die eigentliche Sortierung durchzuführen.

Jave
quelle
Ich habe Comparable in meiner Klasse implementiert, aber eine Methode erstellt, um sort in der Liste aufzurufen, wenn ich sie sortieren muss, aber wie sortiere ich sie nach einem Wert mit im Objekt?
James Andresakis
Mit der compareTo()Methode führen Sie den Vergleich durch. Ein wenig googeln gab einige detaillierte Beispiele, wie man es benutzt, hier ist eines davon: javadeveloper.co.in/java-example/java-comparable-example.html
Jave
Ich habe eine Methode ähnlich dem Beispiel eingerichtet, erhalte jedoch die Fehlermeldung, dass ich compareTo nicht für ein Cast-Double verwenden kann. Es scheint aus irgendeinem Grund, was ich tue, mag es nicht. CompareTo (double) kann für den primitiven Typ double nicht aufgerufen werden. Ich füge meinen Code oben hinzu, um zu zeigen, was ich meine
James andresakis
0

Ich habe eine Listenansicht, in der die Informationen zu allen Clients angezeigt werden, für die ich den Clientnamen mithilfe dieser benutzerdefinierten Vergleichsklasse sortiere. Abgesehen von englischen Buchstaben, die ich mit dieser setStrength (Collator.SECONDARY) verwalte, haben sie ein zusätzliches Lerret.

 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);*/
DropAndTrap
quelle
0

Modellklasse:

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

Legen Sie nun die Daten in ArrayList fest

for (int i = 0; i < your_array_length; i++) {
    ToDoModel tm = new ToDoModel();
    tm.setId(your_id);
    tm.setTaskDate(your_date);
    mArrayList.add(tm);
}

Sortieren Sie nun ArrayList

Collections.sort(toDoList);

Zusammenfassung: Ihre Daten werden datenweise sortiert

Hiren Patel
quelle
0

Es ist sehr einfach für Kotlin!

listToBeSorted.sortBy { it.distance }

Musab Gültekin
quelle
0

Für Kotlin können Sie diese Funktion verwenden

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

und nenne es einfach in deinem activityoder fragmentvon

sortList(list)
Kishan Solanki
quelle