Sắp xếp danh sách mảng theo thứ tự bảng chữ cái (không phân biệt chữ hoa chữ thường)


121

Tôi có một danh sách mảng chuỗi nameschứa tên của mọi người. Tôi muốn sắp xếp danh sách mảng theo thứ tự bảng chữ cái.

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

Tôi đã cố gắng sắp xếp danh sách theo cách trên. Nhưng nó đang hiển thị mảng được sắp xếp là:

Athira
Karthika
..
..
ananya
bala
...

nhưng tôi không muốn phân biệt chữ hoa chữ thường. Tôi muốn kết quả là:

ananya
Athira
bala

Câu trả lời:


330

Tùy chỉnh Comparatorsẽ giúp

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

Hoặc nếu bạn đang sử dụng Java 8:

list.sort(String::compareToIgnoreCase);

1
u có thể cho tôi biết chuỗi s1 và s2 là gì không và làm thế nào có thể xem kết quả nếu hàm so sánh trả về giá trị số nguyên.
andro-girl

@seethalakshmi đó là các chuỗi từ danh sách của bạn. Hãy xem tại nguồn của phương pháp Collections.sort nếu bạn muốn biết thêm chi tiết về điều đó
denis.solonenko

tôi muốn hiển thị danh sách đã sắp xếp trong logcat. làm cách nào tôi có thể làm điều đó?
andro-girl,

Nó sẽ xuất hiện dưới dạng Đối tượng, trừ khi bạn chia nhỏ danh sách bằng một vòng lặp sau khi sắp xếp. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
Giỏ hàng bị bỏ rơi

2
@Dante nếu bạn nhìn vào quá trình thực hiện String.CASE_INSENSITIVE_ORDER, thì bạn sẽ thấy rằng A1 được chấp nhận lesshơn A10 chỉ vì chiều dài nhỏ hơn. Không có "loại tự nhiên" hỗ trợ ra khỏi hộp, bạn có thể muốn có một cái nhìn tại stackoverflow.com/questions/1262239/...
denis.solonenko

195

Điều đơn giản nhất để làm là:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@djunod, cảm ơn vì câu trả lời. Tôi cũng đã thử giải pháp của bạn cho ArrayList từ A1 đến A10, nhưng A10 không sắp xếp chính xác giống như giải pháp của denis.solenenko. Bằng cách nào đó, A10 đi sau A1. Về cơ bản, nó được sắp xếp như A1, A10, A2, A3, v.v. Tại sao nó lại xảy ra và làm cách nào để tôi có thể sắp xếp danh sách một cách chính xác?
Dante

2
@dante, đó là sắp xếp chuỗi bình thường. Nếu bạn muốn A2 đến trước A10, bạn sẽ phải thay đổi nó để A02 vv
djunod

1
Plus 1. Cũng hoạt động trong Android. Cảm ơn và chúc mừng.
statosdotcom

@djunod Cảm ơn bạn rất nhiều :)
Kumar

stackoverflow sẽ cung cấp cho tôi một tùy chọn để lưu câu trả lời / đoạn mã như thế này ..
HB.

29

thử mã này

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
Câu trả lời chính xác! Tôi nghĩ rằng nếu bạn thay đổi 'Bộ so sánh thực hiện' thành 'Trình so sánh thực hiện <FBFriends_Obj> và bạn thay đổi các loại Đối tượng trong so sánh với FBFriends_Obj thì bạn không cần dd1 và dd2, bạn có thể sử dụng o1 và o2 trực tiếp trong câu lệnh trả về
FrinkTheBrave

11

Dựa trên các câu trả lời được đề cập ở trên, tôi đã quản lý để so sánh các Đối tượng Lớp tùy chỉnh của mình như sau:

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

Bắt đầu từ Java 8, bạn có thể sử dụng Stream:

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

Nó nhận được một luồng từ đó ArrayList, sau đó nó sắp xếp nó (bỏ qua trường hợp). Sau đó, luồng được chuyển đổi thành một mảng được chuyển thành một ArrayList.

Nếu bạn in kết quả bằng:

System.out.println(sorted);

bạn nhận được kết quả sau:

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

3

Thật không may, tất cả các câu trả lời cho đến nay không tính đến điều đó "a"không được coi là bình đẳng "A"khi nói đến phân loại.

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]

Trong cách tiếp cận 1, bất kỳ chữ thường nào được coi là lớn hơn bất kỳ chữ hoa nào.

Phương pháp 2 làm cho nó tồi tệ hơn, vì CASE_INSENSITIVE_ORDER xem xét "a""A"bằng nhau (kết quả so sánh là 0). Điều này làm cho việc sắp xếp không xác định.

Cách tiếp cận 3 (sử dụng java.text.Collator) là IMHO là cách duy nhất để thực hiện chính xác, vì nó xem xét "a""A"không bình đẳng, nhưng đặt chúng theo thứ tự chính xác theo ngôn ngữ hiện tại (hoặc bất kỳ ngôn ngữ mong muốn nào khác).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.