[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]