การเรียงลำดับรายการอาร์เรย์ตามลำดับตัวอักษร (ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่)


121

ฉันมีสตริงอาร์เรย์namesที่มีชื่อบุคคล ฉันต้องการจัดเรียงรายการอาร์เรย์ตามลำดับตัวอักษร

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

ฉันพยายามจัดเรียงรายการตามวิธีด้านบน แต่กำลังแสดงอาร์เรย์ที่เรียงลำดับเป็น:

Athira
Karthika
..
..
ananya
bala
...

แต่ฉันไม่อยากให้เป็นเรื่องละเอียดอ่อน ฉันต้องการผลลัพธ์เป็น:

ananya
Athira
bala

คำตอบ:


330

กำหนดเองน่าComparatorจะช่วยได้

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

หรือถ้าคุณใช้ Java 8:

list.sort(String::compareToIgnoreCase);

1
คุณช่วยบอกฉันได้ไหมว่าสตริง s1 และ s2 คืออะไรและจะเห็นผลลัพธ์ได้อย่างไรว่าฟังก์ชันเปรียบเทียบส่งคืนค่าจำนวนเต็ม
andro-girl

@seethalakshmi นั่นคือสตริงจากรายการของคุณ โปรดดูแหล่งที่มาของวิธีการ Collections.sort หากคุณต้องการรับรายละเอียดเพิ่มเติมเกี่ยวกับที่
denis.solonenko

ฉันต้องการแสดงรายการที่จัดเรียงใน logcat ฉันจะทำได้อย่างไร?
andro-girl

มันจะปรากฏเป็น Object เว้นแต่คุณจะแยกย่อยรายการด้วยการวนซ้ำหลังจากการเรียงลำดับ for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
รถเข็นที่ถูกทิ้ง

2
@ ดันเต้ถ้าคุณดู hthe การใช้งานString.CASE_INSENSITIVE_ORDERคุณจะเห็นว่า A1 นั้นย่อมาlessจาก A10 เพียงเพราะว่าความยาวนั้นเล็กกว่า ไม่มีการสนับสนุนแบบ "ธรรมชาติ" นอกกรอบคุณอาจต้องการดูที่stackoverflow.com/questions/1262239/…
denis.solonenko

195

สิ่งที่ง่ายที่สุดที่ต้องทำคือ:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@djunod ขอบคุณสำหรับคำตอบ ฉันได้ลองวิธีแก้ปัญหาของคุณสำหรับ ArrayList ตั้งแต่ A1 ถึง A10 แต่ A10 ไม่ได้เรียงลำดับอย่างถูกต้องเหมือนกับโซลูชันของ denis.solenenko อย่างใด A10 ไปตาม A1 โดยทั่วไปจะเรียงลำดับเช่น A1, A10, A2, A3 ฯลฯ ทำไมมันถึงเกิดขึ้นและฉันจะเรียงลำดับรายการให้ถูกต้องได้อย่างไร
Dante

2
@dante นั่นคือการเรียงลำดับสตริงปกติ หากคุณต้องการให้ A2 มาก่อน A10 คุณจะต้องเปลี่ยนเป็น A02 เป็นต้น
djunod

1
บวก 1. ทำงานใน Android ด้วย ขอบคุณและขอแสดงความยินดี
statosdotcom

@djunod ขอบคุณมากค่ะ :)
Kumar

stackoverflow ควรมีตัวเลือกในการบันทึกคำตอบ / ตัวอย่างข้อมูลเช่นนี้ ..
HB.

29

ลองใช้รหัสนี้

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
ตอบโจทย์มาก! ฉันคิดว่าถ้าคุณเปลี่ยน 'ใช้ตัวเปรียบเทียบ' เป็น 'ใช้ตัวเปรียบเทียบ <FBFriends_Obj> และคุณเปลี่ยนประเภทวัตถุในการเปรียบเทียบกับ FBFriends_Obj คุณไม่จำเป็นต้องใช้ dd1 และ dd2 คุณสามารถใช้ o1 และ o2 ได้โดยตรงในคำสั่ง return
FrinkTheBrave

11

จากคำตอบที่กล่าวมาข้างต้นฉันสามารถเปรียบเทียบ Class Objects ที่กำหนดเองได้ดังนี้:

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คุณสามารถใช้Stream:

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

มันได้รับกระแสจากArrayListนั้นมันก็จัดเรียง (โดยไม่สนใจกรณี) หลังจากนั้นสตรีมจะถูกแปลงเป็นอาร์เรย์ซึ่งจะถูกแปลงเป็นArrayListไฟล์.

หากคุณพิมพ์ผลลัพธ์โดยใช้:

System.out.println(sorted);

คุณจะได้รับผลลัพธ์ต่อไปนี้:

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

3

น่าเสียดายที่คำตอบทั้งหมดที่ผ่านมาไม่ได้คำนึงถึงว่า"a"จะต้องไม่ถือว่าเท่ากับ"A"เมื่อต้องจัดเรียง

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]

ในแนวทางที่ 1 อักษรตัวพิมพ์เล็กใด ๆ จะถือว่ามากกว่าอักษรตัวพิมพ์ใหญ่

แนวทางที่ 2 ทำให้แย่ลงเนื่องจาก CASE_INSENSITIVE_ORDER พิจารณา"a"และ"A"เท่าเทียมกัน (ผลการเปรียบเทียบคือ0) สิ่งนี้ทำให้การเรียงลำดับไม่ถูกกำหนด

แนวทางที่ 3 (โดยใช้ java.text.Collator) คือ IMHO เป็นวิธีเดียวในการดำเนินการอย่างถูกต้องเนื่องจากพิจารณา"a"แล้ว"A"ไม่เท่ากัน แต่วางลำดับที่ถูกต้องตามสถานที่ปัจจุบัน (หรืออื่น ๆ ที่ต้องการ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.