Dizi listesini alfabetik sıraya göre sıralama (büyük / küçük harfe duyarlı değil)


121

namesİnsanların isimlerini içeren bir dizi listesi var . Dizi listesini alfabetik sıraya göre sıralamak istiyorum.

ArrayList<String> names = new ArrayList<String>();
names.add("seetha");
names.add("sudhin");
names.add("Swetha");
names.add("Neethu");
names.add("ananya");
names.add("Athira");
names.add("bala");
names.add("Tony");
names.add("Karthika");
names.add("Nithin");
names.add("Vinod");
names.add("jeena");
Collections.sort(names);
for(int i=0; i<names.size(); i++)
    System.out.println(names.get(i));

Listeyi yukarıdaki şekilde sıralamayı denedim. Ancak sıralanan diziyi şu şekilde görüntülüyor:

Athira
Karthika
..
..
ananya
bala
...

ancak büyük / küçük harfe duyarlı olmasını istemiyorum. Sonucu şu şekilde istiyorum:

ananya
Athira
bala

Yanıtlar:


330

Özel Comparatoryardımcı olmalı

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
});

Veya Java 8 kullanıyorsanız:

list.sort(String::compareToIgnoreCase);

1
s1 ve s2 dizelerinin ne olduğunu söyleyebilir misiniz? ve karşılaştırma işlevi tamsayı değeri döndürüyorsa sonucu nasıl görebilirim?
andro-girl

@seethalakshmi, listenizdeki dizelerdir.
Bununla

logcat'te sıralanan listeyi görüntülemek istiyorum. bunu nasıl yapabilirim?
andro-girl

Listeyi sıraladıktan sonra bir döngü ile ayırmadığınız sürece, bir Nesne olarak görünecektir. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Terkedilmiş Sepet

2
@Dante'nin uygulamasına bakarsanız , uzunluğu daha küçük olduğu için String.CASE_INSENSITIVE_ORDERA1'in A10'dan lessdaha doğru olduğunu göreceksiniz . Kutudan çıkan "doğal sıralama" desteği yoktur, stackoverflow.com/questions/1262239/…
adresine

195

Yapılacak en basit şey şudur:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@djunod, cevap için teşekkürler. A1'den A10'a ArrayList çözümünüzü de denedim, ancak A10, denis.solenenko'nun çözümü gibi doğru bir şekilde sıralanmadı. Her nasılsa, A10 A1'in peşinden gidiyor. Temel olarak A1, A10, A2, A3, vb. Şeklinde sıralandı. Neden oldu ve listeyi nasıl doğru sıralayabilirim?
Dante

2
@dante, bu normal dize sıralamasıdır. A2'nin
A10'dan

1
Artı 1. Android'de de çalıştı. Teşekkürler ve tebrikler
statosdotcom

@djunod Çok teşekkür ederim :)
Kumar

stackoverflow bana yanıtları / parçacıkları bunun gibi kaydetme seçeneği sunmalıdır ..
HB.

29

bu kodu dene

Collections.sort(yourarraylist, new SortBasedOnName());



import java.util.Comparator;
import com.RealHelp.objects.FBFriends_Obj;
import com.RealHelp.ui.importFBContacts;

public class SortBasedOnName implements Comparator
{
public int compare(Object o1, Object o2) 
{

    FBFriends_Obj dd1 = (FBFriends_Obj)o1;// where FBFriends_Obj is your object class
    FBFriends_Obj dd2 = (FBFriends_Obj)o2;
    return dd1.uname.compareToIgnoreCase(dd2.uname);//where uname is field name
}

}

3
Mükemmel cevap! 'Karşılaştırıcı uygular'ı' Karşılaştırıcıyı <FBFriends_Obj> uygular 'olarak değiştirirseniz ve karşılaştırmadaki Nesne türlerini FBFriends_Obj ile değiştirirseniz, o zaman dd1 ve dd2'ye ihtiyacınız olmazsa, o1 ve o2'yi doğrudan dönüş ifadesinde kullanabilirsiniz
FrinkTheBrave

11

Yukarıda belirtilen cevaplara dayanarak, özel Sınıf Nesnelerimi şu şekilde karşılaştırmayı başardım:

ArrayList<Item> itemList = new ArrayList<>();
...
Collections.sort(itemList, new Comparator<Item>() {
            @Override
            public int compare(Item item, Item t1) {
                String s1 = item.getTitle();
                String s2 = t1.getTitle();
                return s1.compareToIgnoreCase(s2);
            }

        });


3

Java 8'den başlayarak şunları kullanabilirsiniz Stream:

List<String> sorted = Arrays.asList(
                          names.stream().sorted(
                              (s1, s2) -> s1.compareToIgnoreCase(s2)
                          ).toArray(String[]::new)
                      );

Bundan bir akış alır ArrayList, sonra sıralar (durumu görmezden gelerek). Bundan sonra, akım bir diziye dönüştürülür ve bir ArrayList.

Sonucu kullanarak yazdırırsanız:

System.out.println(sorted);

aşağıdaki çıktıyı elde edersiniz:

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]

3

Ne yazık ki, şimdiye kadarki tüm cevaplar , sıralama söz konusu olduğunda "a"eşit kabul edilmemesi gerekenleri hesaba "A"katmıyor.

String[] array = {"b", "A", "C", "B", "a"};

// Approach 1
Arrays.sort(array);
// array is [A, B, C, a, b]

// Approach 2
Arrays.sort(array, String.CASE_INSENSITIVE_ORDER);
// array is [A, a, b, B, C]

// Approach 3
Arrays.sort(array, java.text.Collator.getInstance());
// array is [a, A, b, B, C]

Yaklaşım 1'de herhangi bir küçük harf, herhangi bir büyük harften daha büyük kabul edilir.

CASE_INSENSITIVE_ORDER düşündüğünden dolayı, 2 yapar daha kötü yaklaşın "a"ve "A"eşit (karşılaştırmada sonucudur 0). Bu, sıralamayı deterministik olmayan yapar.

Yaklaşım 3 (java.text.Collator kullanarak), IMHO'yu doğru olarak yapmanın tek yoludur, çünkü onu eşit olarak görür "a"ve "A"eşit değildir, ancak mevcut (veya istenen başka herhangi bir yerel) Yerel Ayara göre doğru sıraya koyar.

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.