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

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



답변

커스텀 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);


답변

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

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);


답변

이 코드를 시도

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
}

}


답변

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

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

        });


답변

compareToIgnoreCasecompareTo가 아닌 을 사용할 사용자 지정 비교기를 사용해야 합니다.


답변

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]


답변

불행히도 지금까지의 모든 답변 은 정렬 "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"현재 로케일에 따라 올바른 순서로 배치하기 때문입니다.