[java] 알파벳순으로 목록을 정렬하려면 어떻게해야합니까?

List<String>국가 이름이 포함 된 개체가 있습니다. 이 목록을 알파벳순으로 정렬하려면 어떻게해야합니까?



답변

이것이 문자열이라고 가정하면 편리한 정적 메소드를 사용하십시오 sort

 java.util.Collections.sort(listOfCountryNames)


답변

Collections.sort가있는 솔루션

해당 목록을 사용해야하는 경우 또는 프로그램의 구조가 다음과 같은 경우

  • 리스트 작성
  • 일부 국가 이름 추가
  • 한 번 정렬
  • 해당 목록을 다시 변경하지 마십시오

그런 다음 Thilos의 답변이 최선의 방법입니다. Tom Hawtin-tackline 의 조언과 결합하면 다음과 같은 이점 이 있습니다.

java.util.Collections.sort(listOfCountryNames, Collator.getInstance());

TreeSet을 사용한 솔루션

자유롭게 결정할 수 있고 응용 프로그램이 더 복잡해지면 TreeSet을 대신 사용하도록 코드를 변경할 수 있습니다. 이러한 종류의 컬렉션은 항목을 삽입 할 때만 정렬합니다. sort ()를 호출 할 필요가 없습니다.

Collection<String> countryNames =
    new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.

TreeSet을 선호하는 이유에 대한 참고 사항

여기에는 미묘하지만 중요한 장점이 있습니다.

  • 더 짧습니다. 그러나 단 한 줄만 짧습니다.
  • 걱정하지 마십시오 . TreeSet이 항상 정렬 되기 때문에이 목록이 실제로 정렬되어 있기 때문에 걱정 하지 마십시오.
  • 중복 된 항목을 가질 수 없습니다. 상황에 따라 이것은 찬반 양론 일 수 있습니다. 중복이 필요하면 목록을 고수하십시오.
  • 숙련 된 프로그래머 가보고 TreeSet<String> countyNames즉시 알고 있습니다 : 이것은 복제본이없는 정렬 된 문자열 모음이며 매 순간마다 이것이 사실임을 확신 할 수 있습니다 . 짧은 선언에 많은 정보가 있습니다.
  • 어떤 경우에는 실제 성능이 승리합니다. List를 사용하고 값을 매우 자주 삽입하고 해당 삽입 사이에서 목록을 읽을 수있는 경우 삽입 할 때마다 목록을 정렬해야합니다. 세트는 동일하지만 훨씬 빠릅니다.

올바른 작업에 올바른 컬렉션을 사용하는 것은 짧고 버그가없는 코드를 작성하는 데 중요합니다. 이 경우 한 줄만 저장하기 때문에 실증적이지 않습니다. 그러나 중복이 없는지 확인하려는 사람이 목록을 사용하는 빈도를 세고 그 기능을 직접 구축했습니다. 또는 더 나쁜 것은 실제로지도가 필요할 때 두 개의 목록을 사용하는 것입니다.

잘못 이해하지 마십시오. Collections.sort 사용은 오류나 결함이 아닙니다. 그러나 TreeSet가 훨씬 더 깨끗한 경우가 많이 있습니다.


답변

Java 8 Stream 또는 Guava를 사용하여 새로운 정렬 사본을 만들 수 있습니다.

// Java 8 version
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
// Guava version
List<String> sortedNames = Ordering.natural().sortedCopy(names); 

또 다른 옵션은 Collections API를 통해 내부 정렬하는 것입니다.

Collections.sort(names);


답변

안하는 것보다 늦게하는 것이 낫다! 우리가 할 수있는 방법은 다음과 같습니다 (학습 목적으로 만).

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class SoftDrink {
    String name;
    String color;
    int volume;

    SoftDrink (String name, String color, int volume) {
        this.name = name;
        this.color = color;
        this.volume = volume;
    }
}

public class ListItemComparision {
    public static void main (String...arg) {
        List<SoftDrink> softDrinkList = new ArrayList<SoftDrink>() ;
        softDrinkList .add(new SoftDrink("Faygo", "ColorOne", 4));
        softDrinkList .add(new SoftDrink("Fanta",  "ColorTwo", 3));
        softDrinkList .add(new SoftDrink("Frooti", "ColorThree", 2));
        softDrinkList .add(new SoftDrink("Freshie", "ColorFour", 1));

        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //use instanceof to verify the references are indeed of the type in question
                return ((SoftDrink)softDrinkOne).name
                        .compareTo(((SoftDrink)softDrinkTwo).name);
            }
        });
        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.name + " - " + sd.color + " - " + sd.volume);
        }
        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //comparision for primitive int uses compareTo of the wrapper Integer
                return(new Integer(((SoftDrink)softDrinkOne).volume))
                        .compareTo(((SoftDrink)softDrinkTwo).volume);
            }
        });

        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.volume + " - " + sd.color + " - " + sd.name);
        }
    }
}


답변

한 줄로 Java 8을 사용하십시오.

list.sort(Comparator.naturalOrder());


답변

에 대한 두 개의 인수를 사용하십시오 Collections.sort. Comparator통해 얻을 수있는 것과 같이 대소 문자를 적절하게 처리하는 (즉, UTF16 순서가 아닌 어휘를 수행 하는) 적합 을 원할 것 java.text.Collator.getInstance입니다.


답변

악센트없는 영어로만 문자열을 정렬하지 않는 한을 사용하는 것이 Collator좋습니다. 발음 구별 부호를 올바르게 정렬하고 대소 문자 및 기타 언어 관련 내용을 무시할 수 있습니다.

Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));

collator 강도를 설정할 수 있습니다 ( javadoc 참조).

여기 슬로바키아어에 대한 예입니다 Š이후 가야는 S하지만, UTF에서 Š어딘가에는 이후 Z:

List<String> countries = Arrays.asList("Slovensko", "Švédsko", "Turecko");

Collections.sort(countries);
System.out.println(countries); // outputs [Slovensko, Turecko, Švédsko]

Collections.sort(countries, Collator.getInstance(new Locale("sk")));
System.out.println(countries); // outputs [Slovensko, Švédsko, Turecko]