Mengurutkan daftar larik dalam urutan abjad (tidak membedakan huruf besar / kecil)

121

Saya memiliki daftar larik string namesyang berisi nama orang. Saya ingin mengurutkan daftar larik dalam urutan abjad.

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

Saya mencoba mengurutkan daftar dengan cara di atas. Tapi itu menampilkan array yang diurutkan sebagai:

Athira
Karthika
..
..
ananya
bala
...

tapi saya tidak ingin membuatnya peka huruf besar / kecil. Saya ingin hasilnya sebagai:

ananya
Athira
bala
andro-girl
sumber

Jawaban:

330

Kustom Comparatorharus membantu

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

Atau jika Anda menggunakan Java 8:

list.sort(String::compareToIgnoreCase);
denis.solonenko
sumber
1
can u ceritakan apa itu string s1 dan s2? dan bagaimana dapat melihat hasilnya jika membandingkan fungsi mengembalikan nilai integer.
andro-gadis
@seethalakshmi itulah string dari daftar Anda. Silakan lihat pada sumber dari metode Collections.sort jika Anda ingin mendapatkan rincian lebih lanjut tentang itu
denis.solonenko
saya ingin menampilkan daftar yang diurutkan di logcat. bagaimana cara melakukannya?
andro-gadis
Ini akan muncul sebagai Objek, kecuali Anda memecah daftar dengan lingkaran setelah pengurutan. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Keranjang Terbengkalai
2
@Dante jika Anda melihat pada implementasinya String.CASE_INSENSITIVE_ORDER, maka Anda akan melihat bahwa A1 condired lessdaripada A10 hanya karena panjangnya lebih kecil. Tidak ada dukungan "alami" di luar kotak, Anda mungkin ingin melihat stackoverflow.com/questions/1262239/…
denis.solonenko
195

Hal yang paling sederhana untuk dilakukan adalah:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
djunod.dll
sumber
@djunod, terima kasih atas jawabannya. Saya juga telah mencoba solusi Anda untuk ArrayList dari A1 hingga A10, tetapi A10 tidak mengurutkan dengan benar seperti solusi denis.solenenko. Entah bagaimana, A10 mengejar A1. Pada dasarnya, ini diurutkan seperti A1, A10, A2, A3, dll. Mengapa hal itu terjadi dan bagaimana cara mengurutkan daftar dengan benar?
Dante
2
@ Dante, itu penyortiran string normal. Jika Anda ingin A2 datang sebelum A10, Anda harus mengubahnya menjadi A02, dll.
djunod
1
Plus 1. Bekerja di Android juga. Terima kasih dan selamat.
statosdotcom
@djunod Terima kasih banyak :)
Kumar
stackoverflow seharusnya memberi saya opsi untuk menyimpan jawaban / cuplikan seperti ini ..
HB.
29

coba kode ini

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
}

}
peretas
sumber
3
Jawaban yang bagus! Saya pikir jika Anda mengubah 'implements Comparator' menjadi 'implements Comparator <FBFriends_Obj> dan Anda mengubah tipe Objek di bandingkan dengan FBFriends_Obj maka Anda tidak perlu dd1 dan dd2 Anda dapat menggunakan o1 dan o2 langsung di pernyataan pengembalian
FrinkTheBrave
11

Berdasarkan jawaban yang disebutkan di atas, saya berhasil membandingkan Objek Kelas kustom saya seperti ini:

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

        });
Usman
sumber
4

Anda perlu menggunakan komparator khusus yang akan digunakan compareToIgnoreCase, bukan bandingkanTo.

Vladimir Ivanov
sumber
saya mencoba tautan ini. tetapi saya tidak dapat menemukan solusi. bisakah kamu jelaskan
andro-girl
3

Mulai dari Java 8 Anda dapat menggunakan Stream:

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

Ia mendapat aliran dari itu ArrayList, lalu menyortirnya (mengabaikan kasus). Setelah itu, aliran diubah menjadi array yang diubah menjadi file ArrayList.

Jika Anda mencetak hasilnya menggunakan:

System.out.println(sorted);

Anda mendapatkan output berikut:

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

Sayangnya, semua jawaban sejauh ini tidak memperhitungkan yang "a"tidak boleh dianggap sama "A"ketika harus menyortir.

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]

Dalam pendekatan 1, setiap huruf kecil dianggap lebih besar daripada huruf besar mana pun.

Pendekatan 2 membuatnya lebih buruk, karena CASE_INSENSITIVE_ORDER menganggap "a"dan "A"sama (hasil perbandingannya adalah 0). Ini membuat penyortiran menjadi non-deterministik.

Pendekatan 3 (menggunakan java.text.Collator) adalah IMHO satu-satunya cara untuk melakukannya dengan benar, karena ia menganggap "a"dan "A"tidak sama, tetapi menempatkannya dalam urutan yang benar sesuai dengan Lokal saat ini (atau yang diinginkan lainnya).

Lars Gendner
sumber