알파벳순으로 배열 목록 정렬 (대소 문자 구분 안 함)


121

names사람들의 이름이 포함 된 문자열 arraylist 가 있습니다. 배열 목록을 알파벳 순서로 정렬하고 싶습니다.

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가 무엇인지 알려주고 비교 함수가 정수 값을 반환하는 경우 결과를 어떻게 볼 수 있습니까?
안드로 - 여자

@seethalakshmi는 목록의 문자열입니다. 더 자세한 정보를 원하시면 Collections.sort 메소드의 소스를보십시오
denis.solonenko 2011

logcat에 정렬 된 목록을 표시하고 싶습니다.
andro-girl 2011-04-28

정렬 후 루프로 목록을 나누지 않는 한 객체로 나타납니다. for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
버려진 카트

2
@Dante의 구현을 String.CASE_INSENSITIVE_ORDER살펴보면 less길이가 더 작기 때문에 A1이 A10보다 condired된다는 것을 알 수 있습니다 . 더 "자연 일종의"밖으로 상자의 지원이 없습니다, 당신은 좀 걸릴 수도 있습니다 stackoverflow.com/questions/1262239/...을
denis.solonenko

195

가장 간단한 방법은 다음과 같습니다.

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@djunod, 답변 주셔서 감사합니다. A1에서 A10까지 ArrayList에 대한 솔루션도 시도했지만 A10은 denis.solenenko의 솔루션처럼 올바르게 정렬되지 않았습니다. 어쨌든 A10은 A1을 쫓습니다. 기본적으로 A1, A10, A2, A3 등과 같이 정렬되어 있습니다. 왜 발생했고 목록을 올바르게 정렬하려면 어떻게해야합니까?
Dante

2
@dante, 그것은 정상적인 문자열 정렬입니다. A2가 A10보다 먼저 나오도록하려면 A02 등으로 변경해야합니다.
djunod

1
게다가 1. Android에서도 작동했습니다. 감사합니다. 축하합니다.
statosdotcom

@djunod U 아주 많이 :) 감사
쿠마

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
좋은 대답입니다! 'implements Comparator'를 'implements Comparator <FBFriends_Obj>로 변경하고 비교에서 Object 유형을 FBFriends_Obj로 변경하면 dd1 및 dd2가 필요하지 않은 경우 반환 문에서 o1 및 o2를 직접 사용할 수 있습니다
FrinkTheBrave

11

위에서 언급 한 답변을 바탕으로 다음과 같이 사용자 정의 클래스 객체를 비교했습니다.

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.