Android-java- Bir nesne listesini nesne içindeki belirli bir değere göre sıralama


112

Nesnelerin bir dizi listesini, nesne içindeki belirli bir değere göre sıralamaya çalışıyorum. Böyle bir şeyi yapmak için en iyi yaklaşım ne olurdu? Collections.sort () 'u bir tür karşılaştırıcıyla kullanmalı mıyım?

Bir nesne listesini, değişkenlerden birinde tuttukları bir kayan değerle sıralamaya çalışıyorum.

DÜZENLEME: Şimdiye kadar sahip olduğum şey bu:

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

hata durumları: double ilkel türünde CompareTo (double) çağrılamaz.

Bir karşılaştırıcının belirli bir türden başka bir şey döndürememesinden mi?


2
"Collections.sort () 'u bir tür karşılaştırıcıyla kullanmalı mıyım?" Evet, kulağa iyi bir fikir gibi geliyor
Kennet

Önemli olup olmadığını bilmiyorum ama listedeki nesnelerin sayısı 80'e kadar çıkacak. Bu yüzden bir karşılaştırıcı kullanma konusunda kafam karıştı, eğer doğru yol buysa, çünkü aynı anda sadece iki değeri karşılaştırıyor.
James andresakis

Sıralama böyle çalışır. Önce bir listeye bir öğe ekleyin. Sonraki eklerken; bu listedeki geçerli olanın öncesine mi yoksa sonrasına mı gitmelidir. Üçüncü öğe eklerken listedeki ilk öğe ile, daha sonra ise sonraki öğeyle karşılaştırın. Ve bunun gibi.
Kennet

Yanıtlar:


98

Aradığınız şey varsayılan bir sıralama ise, Karşılaştırıcı yerine Karşılaştırılabilir'i kullanmalısınız.

Buraya bakın, bu biraz yardımcı olabilir - Bir sınıf ne zaman Karşılaştırılabilir ve / veya Karşılaştırıcı olmalıdır?

Bunu dene -

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

Hey, bağlantı için teşekkürler :) Bir dilden diğerine gidip geliyorum, bu yüzden her zaman bir şeyler kaçırıyorum: p, nasıl gittiğini biliyorsun ...... tüm esnafların jack'ı ama hiçbirinin ustası lol
James andresakis

365

Herhangi bir ArrayList'i sıralamak için bu kodu izleyin

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
Bu en iyi cevap olmalı!
John Smith

3
basit ve harika cevap, tebrikler kardeşim :)
Sadashiv

1
Basit ve küçük .. Teşekkürler!
Vora ile tanış

1
Bu gerçekten temiz görünüyor. Teşekkürler. Ve sağlanan ipuçları için bir artı.
Anurag

3
Çalışmalar yalnızca API 24 ve üzeri için
Themelis

42

Bunun sana daha iyi yardımcı olacağını düşünüyorum

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

Artık Boxing'e gerek yok (yani OBJECTyeni Operatör kullanarak Yaratmaya gerek yok , CompareTo of Collections.Sort ile başlatılan valueOf kullanın.)

1) Artan düzen için

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

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

1) Azalan sipariş için

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" burada "normal java" dan hiçbir şekilde farklı değildir, bu yüzden evet Collections.sort()iyi bir yaklaşım olacaktır.


1
Ama onu nesne içindeki bir değere göre nasıl sıralayabilirim? Ben de bunu yapıyorum.
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;

Nasıl kullanılır:

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

2

Bunu kullanarak iki String'i karşılaştırabilirsiniz.

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

                    }

                });

Ve Şimdi bir ContactData Sınıfı oluşturun.

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;

}
}

Burada kişiler listesi:

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

1

ComparatorNesnelerinizi karşılaştırabilen bir tane oluşturun ya da hepsi aynı sınıfın örnekleriyse, o sınıfın uygulanmasını sağlayabilirsiniz Comparable. Daha sonra gerçek sıralamayı yapmak için Collections.sort () kullanabilirsiniz.


Devam ettim ve sınıfımda Comparable'ı uyguladım, ancak sıralanması gerektiğinde listede sıralamayı çağırmak için bir yöntem oluşturdum, ancak bunu nesnedeki bir değere göre nasıl sıralayabilirim?
James andresakis

compareTo()Eğer karşılaştırma yapmak nerede kullanılan yöntem olduğunu. Biraz googling, nasıl kullanılacağına dair birkaç ayrıntılı örnek verdi, işte bunlardan biri: javadeveloper.co.in/java-example/java-comparable-example.html
Jave

Örneğe benzer bir yöntem kurdum ancak bir cast double üzerinde CompareTo kullanamadığımı belirten bir hata alıyorum. Her ne sebeple olursa olsun, yaptığım şeyi sevmiyormuş gibi görünüyor. Double ilkel türü üzerinde CompareTo (double) çağrılamaz. Ne demek istediğimi göstermek için kodumu yukarıya ekleyeceğim
James andresakis

1

Model Sınıfı:

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

Şimdi ArrayList'te verileri ayarlayın

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

Şimdi Dizi Listesini Sırala

Collections.sort(toDoList);

Özet: Verilerinizi tarihe göre sıralayacaktır


1

İçin KOTLIN , bu işlevi kullanabilirsiniz

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

ve sadece seninle activityveya fragmenttarafından ara

sortList(list)

0

Bu özel karşılaştırıcı sınıfını kullanarak istemcilerin adını sıraladığım tüm istemciler hakkındaki bilgileri gösteren bir liste görünümüm var. Bu setStrength (Collator.SECONDARY) ile yönettiğim İngilizce harflerin dışında ekstra lerretleri var

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.