답변:
해당 목록을 사용해야하는 경우 또는 프로그램의 구조가 다음과 같은 경우
그런 다음 Thilos의 답변이 최선의 방법입니다. Tom Hawtin-tackline 의 조언과 결합하면 다음과 같은 이점 이 있습니다.
java.util.Collections.sort(listOfCountryNames, Collator.getInstance());
자유롭게 결정할 수 있고 응용 프로그램이 더 복잡해지면 TreeSet을 대신 사용하도록 코드를 변경할 수 있습니다. 이러한 종류의 컬렉션은 항목을 삽입 할 때만 정렬합니다. sort ()를 호출 할 필요가 없습니다.
Collection<String> countryNames =
new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.
여기에는 미묘하지만 중요한 장점이 있습니다.
TreeSet<String> countyNames
즉시 알고 있습니다 : 이것은 복제본이없는 정렬 된 문자열 모음이며 매 순간마다 이것이 사실임을 확신 할 수 있습니다 . 짧은 선언에 많은 정보가 있습니다.올바른 작업에 올바른 컬렉션을 사용하는 것은 짧고 버그가없는 코드를 작성하는 데 중요합니다. 이 경우 한 줄만 저장하기 때문에 실증적이지 않습니다. 그러나 중복이 없는지 확인하려는 사람이 목록을 사용하는 빈도를 세고 그 기능을 직접 구축했습니다. 또는 더 나쁜 것은 실제로지도가 필요할 때 두 개의 목록을 사용하는 것입니다.
잘못 이해하지 마십시오. 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);
}
}
}
에 대한 두 개의 인수를 사용하십시오 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]
여기 당신이 찾고있는 것입니다
listOfCountryNames.sort(String::compareToIgnoreCase)
를 사용하여 Collections.sort()
목록을 정렬 할 수 있습니다.
public class EmployeeList {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> empNames= new ArrayList<String>();
empNames.add("sudheer");
empNames.add("kumar");
empNames.add("surendra");
empNames.add("kb");
if(!empNames.isEmpty()){
for(String emp:empNames){
System.out.println(emp);
}
Collections.sort(empNames);
System.out.println(empNames);
}
}
}
산출:
sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]
내림차순 알파벳 :
List<String> list;
...
Collections.sort(list);
Collections.reverse(list);
자바 8에서 동일 :-
//Assecnding order
listOfCountryNames.stream().sorted().forEach((x) -> System.out.println(x));
//Decending order
listOfCountryNames.stream().sorted((o1, o2) -> o2.compareTo(o1)).forEach((x) -> System.out.println(x));
//Here is sorted List alphabetically with syncronized
package com.mnas.technology.automation.utility;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
/**
*
* @author manoj.kumar
*/
public class SynchronizedArrayList {
static Logger log = Logger.getLogger(SynchronizedArrayList.class.getName());
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<Employee> synchronizedList = Collections.synchronizedList(new ArrayList<Employee>());
synchronizedList.add(new Employee("Aditya"));
synchronizedList.add(new Employee("Siddharth"));
synchronizedList.add(new Employee("Manoj"));
Collections.sort(synchronizedList, new Comparator() {
public int compare(Object synchronizedListOne, Object synchronizedListTwo) {
//use instanceof to verify the references are indeed of the type in question
return ((Employee)synchronizedListOne).name
.compareTo(((Employee)synchronizedListTwo).name);
}
});
/*for( Employee sd : synchronizedList) {
log.info("Sorted Synchronized Array List..."+sd.name);
}*/
// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (synchronizedList) {
Iterator<Employee> iterator = synchronizedList.iterator();
while (iterator.hasNext()) {
log.info("Sorted Synchronized Array List Items: " + iterator.next().name);
}
}
}
}
class Employee {
String name;
Employee (String name) {
this.name = name;
}
}
내가 만든 방법을 사용해보십시오.
String key
-원하는 순서가되며이 경우에는 알파벳순입니다. 그냥 "abc ..."를 넣으십시오.
String list[]
-키를 사용하여 정렬하려는 목록.
int index
-0으로 설정하면 키의 오프셋이 설정됩니다.
public static String[] order(String key, String list[], int index) {
ArrayList<String> order_List = new ArrayList<String>();
ArrayList<String> temp_Order_List = null;
char[] key_char = key.toCharArray();
for (int offset = 0; offset < key_char.length; offset++) {
if (key_char.length >= offset + index) {
String str = (index > 1 ? list[0].substring(0, index - 1) : "")
+ new String(key_char, offset, 1);
for (int i = 0; i < list.length; i++) {
temp_Order_List = new ArrayList<String>();
for (int k = 0; k < list.length; k++) {
if (!order_List.contains(list[k])
&& !temp_Order_List.contains(list[k])) {
if (list[k].equalsIgnoreCase(str))
order_List.add(list[k]);
else if (list[k].toLowerCase().startsWith(str.toLowerCase())) {
temp_Order_List.add(list[k]);
}
}
}
if (temp_Order_List.size() > 0) {
if (temp_Order_List.size() > 1) {
String[] add = order(key,
temp_Order_List.toArray(new String[temp_Order_List
.size()]), index + 1);
for (String s : add) {
order_List.add(s);
}
} else {
order_List.add(temp_Order_List.get(0));
}
}
}
}
}
return order_List.toArray(new String[order_List.size()]);
}