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


답변:


218

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

 java.util.Collections.sort(listOfCountryNames)

"UK"와 같은 국가 이름이있는 경우 해당 이름이 손상됩니다.
Tom Hawtin-tackline

1
이 경우 추가 인수로 Comparator를 전달할 수 있습니다. 그래도 Comparator를 구현하는 것은 흥미로운 부분입니다.
Thilo

7
비교기 구현 = java.text.Collator.getInstance 사용
Thilo

143

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가 훨씬 더 깨끗한 경우가 많이 있습니다.


정렬보다 TreeSet을 사용하면 이점이 없습니다.
DJClayworth 2009

1
Well TreeSet은 우발적 인 중복을 피하고 (좋거나 나쁠 수 있음) 더 빨라야하지만 (입력 크기가별로 주어지지는 않지만) 모든 입력 후 정렬되지 않고 항상 정렬됩니다 (각각의 목록을 정렬하지 않는 한) 삽입) 문제가 될 수도 있지만 아닐 수도 있습니다.
TofuBeer

1
@ TofuBeer 당신이하고있는 동안 나는 이것을 명확히하고있었습니다. 그리고 더 빠른 것에 관심이 있다면 stackoverflow.com/questions/168891/…를
Lena Schimmel

7
항목이 변경 가능한 경우 TreeSet은 정렬 상태를 유지하지 않습니다.
Joshua Goldberg

3
@JoshuaGoldberg 나는 그것이 분류되지 않을뿐만 아니라 올바르게 작동하지 않을 것이라고 생각합니다. 최소한 객체의 돌연변이가 정렬 순서에 영향을 미치는 경우. 트리 세트는 검색, 제거, 삽입 등과 같은 작업을 수행하기 위해 정렬되는 항목에 의존합니다.
Lena Schimmel

29

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

28

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

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

4
다시 한번, 한 줄로 할 때이 모든 코드에 대한 정당성은 없습니다. Lena의 답변을 참조하십시오.
james.garriss

1
이것은 연습으로 작동 할 수 있지만 생산 코드에서 본 적이 있다면 그것을 도끼로 삼을 것입니다. 바로.
katzenhut

2
@ james.garriss, Lena의 대답은 간단한 문자열 목록에 대한 것이며, 정렬 할 문자열 속성이 포함 된 객체 목록입니다.
Muneeb Mirza

예,이 답변은 객체로 프로덕션 작업을 할 때 매우 유용합니다. 문자열 목록은 일반적이지 않습니다.
Dominik K

14

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

list.sort(Comparator.naturalOrder());

9

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


9

악센트없는 영어로만 문자열을 정렬하지 않는 한을 사용하는 것이 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]

7

여기 당신이 찾고있는 것입니다

listOfCountryNames.sort(String::compareToIgnoreCase)

1
É è 등의 언어에서는 작동하지 않습니다 ... 이전에 악센트를 제거해야합니다
Vincent D.

5

를 사용하여 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]

4

내림차순 알파벳 :

List<String> list;
...
Collections.sort(list);
Collections.reverse(list);

이것이 내가 찾던 것입니다. 먼저 목록을 다시 AZ로 정렬 한 다음 ZA로 비교해야합니다. 좋은 대답입니다.
japes Sophey

1

자바 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));

0
//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;

}
}

그런데 왜? Lena의 답변에서 1 줄의 코드보다 50 줄의 코드를 사용하는 것이 더 좋은 이유는 무엇입니까?
james.garriss

sort (List <T>, Comparator <? super T>) 메서드는 지정된 비교기에서 유도 된 순서에 따라 지정된 목록을 정렬하는 데 사용됩니다. 이름과 연령에 따라 Emplpyee 목록을 정렬하려면 Collections sort (List, Comparator)

아뇨, 죄송합니다 속성에 따라 객체 목록을 정렬하는 방법과 같은 다른 질문에 대답하고 있습니다. 귀하의 코드는 그 목적에 유용 할 수 있지만 OP의 질문에 너무 과도합니다. :-(
james.garriss

-12

내가 만든 방법을 사용해보십시오.

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

32
물론, 30 줄의 코드를 작성할 수 있다면 왜 java.util.Collections.sort (list)를 사용해야 하는가 :)
Jirka

1
여기에 왜 그렇게 많은 투표권이 있습니까? 누구 든지이 코드를 실행하거나 사용 된 알고리즘을 이해하려고 시도 했습니까?
JBoy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.