>  기사  >  Java  >  Java 목록 정렬 기능을 구현하는 방법

Java 목록 정렬 기능을 구현하는 방법

王林
王林앞으로
2023-05-02 21:40:051077검색

Java Collection Framework에 정의된 목록 구현은 Vector, ArrayList 및 LinkedList입니다. 이러한 컬렉션은 개체 그룹에 대한 색인화된 액세스를 제공합니다. 요소 추가 및 제거를 지원합니다. 그러나 요소 정렬을 기본적으로 지원하지 않습니다.
java.util.Collections 클래스의 sort() 메소드를 사용하여 목록 요소를 정렬할 수 있습니다. List 개체를 메서드에 전달하거나 List 및 Comparator를 전달할 수 있습니다. 목록의 요소가 모두 동일한 유형이고 클래스가 Comparable 인터페이스를 구현하는 경우 간단히 Collections.sort()를 호출할 수 있습니다. 이 클래스가 Comparator를 구현하지 않는 경우 정렬을 위해 Comparator를 sort() 메서드에 전달할 수도 있습니다. 기본 정렬 순서를 사용하지 않으려면 정렬을 위해 Comparator를 sort() 메서드에 전달할 수도 있습니다. 목록의 요소가 모두 동일한 유형이 아닌 경우 정렬할 때 운이 좋지 않을 것입니다. 전용 클래스 간 비교기를 작성하지 않는 한.

정렬 순서는 무엇인가요? 요소가 String 개체인 경우 정렬 순서는 기본적으로 각 문자의 ASCII/유니코드 값인 문자 인코딩을 기반으로 합니다. 엄격한 제한이 영어를 처리하는 것이라면 일반적으로 생략된 정렬 순서로도 충분합니다. 왜냐하면 A-Z를 먼저 정렬한 다음 소문자 a-z를 정렬하기 때문입니다. 그러나 영어가 아닌 단어를 다루거나 다른 정렬 순서를 사용하려는 경우 Collections.sort()의 두 번째 변형이 있습니다. 예를 들어 문자열을 역순으로 정렬하려고 합니다. 이 기능을 수행하려면 Collections 클래스의 reverseOrder()를 통해 역순 비교기를 얻을 수 있습니다. 그런 다음 역방향 비교기를 sort() 메서드에 전달합니다. 즉, 다음을 수행합니다.

<p>List list = ...;<br>Comparator comp = Collections.reverseOrder();<br>Collections.sort(list, comp);</p>

목록에 남자, 남자, 여자, 여자 항목이 포함된 경우 정렬된 목록은 남자, 여자, 남자, 여자가 됩니다. 여기에는 복잡한 것이 없습니다. 주목해야 할 매우 중요한 점은 Collections.sort()가 내부 정렬을 수행한다는 것입니다. 원래 순서를 유지해야 하는 경우 원본 세트를 먼저 복사한 후 다음과 같이 정렬해야 합니다.

<p>List list = ...;<br>List copyOfList = new ArrayList(list);<br>Collections.sort(copyOfList);</p>

여기서 정렬된 목록은 남자, 여자, 남자, 여자, 하지만 원래 목록(남자, 남자, 여자, 여자)은 보존됩니다.

지금까지 정렬은 대소문자를 구분합니다. 대소문자를 구분하지 않고 정렬하는 방법은 무엇입니까? 이를 수행하는 한 가지 방법은 다음과 같이 Comparator를 구현하는 것입니다.

<p>public static class CaseInsensitiveComparator <br>implements Comparator {<br>public int compare(Object element1, <br>Object element2) {<br>String lower1 = <br>element1.toString().toLowerCase();<br>String lower2 = <br>element2.toString().toLowerCase();<br>return lower1.compareTo(lower2);<br>}<br>}</p>

이 클래스를 수동으로 만들 필요는 없습니다. 대신 String 클래스에 정의된 기존 비교기 CASE_INSENSIVTIVE_ORDER를 사용할 수 있습니다.

이 구현에는 약간의 문제가 있습니다. Sort() 알고리즘은 안정적인 정렬을 제공하고 원래 시퀀스와 동일한 요소를 유지합니다. 즉, "woman"과 "Woman"이라는 두 요소가 포함된 목록은 서로 다르게 정렬되며, 이 차이는 두 요소가 목록에 나타나는 순서에 따라 결정됩니다.

언어가 다르면 어떻게 되나요? java.text 패키지는 언어 구분 정렬을 위해 Collector 및 CollectionKey 클래스를 제공합니다. 예는 다음과 같습니다.

텍스트가 기본 언어가 아닌 현지 언어로 되어 있는 경우 다음과 같이 현지 언어를 getInstance() 메서드에 전달해야 합니다.

<p>public static class CollatorComparator <br>implements Comparator {<br>Collator collator = Collator.getInstance();<br>public int compare(Object element1, <br>Object element2) {<br>CollationKey key1 = collator.getCollationKey(<br>element1.toString());<br>CollationKey key2 = collator.getCollationKey(<br>element2.toString());<br>return key1.compareTo(key2);<br>}<br>}</p>

실제 문자열이 아닌 컬렉션 키를 기준으로 정렬하고 있습니다. 이는 대소문자를 구분하지 않는 고정된 정렬 기능을 제공할 뿐만 아니라 여러 언어에 걸쳐 정렬됩니다. 즉, 스페인어 단어와 스페인어가 아닌 단어의 혼합을 정렬하는 경우 mañana(내일)라는 단어가 만트라보다 먼저 순위가 매겨집니다. Collector를 사용하지 않으면 mañana가 만트라 뒤에 올 것입니다.

다음 프로그램은 목록에서 다양한 유형의 정렬을 수행합니다(기본값, 대소문자 구분, 언어 구분):

import java.awt.BorderLayout;
import java.awt.Container;
import java.io.*;
import java.text.*;
import java.util.*;
import javax.swing.*;

public class SortIt {

<p>public static class CollatorComparator <br>implements Comparator {<br>Collator collator = Collator.getInstance();<br>public int compare(Object element1, <br>Object element2) {<br>CollationKey key1 = collator.getCollationKey(<br>element1.toString());<br>CollationKey key2 = collator.getCollationKey(<br>element2.toString());<br>return key1.compareTo(key2);<br>}<br>}</p>

public static class CaseInsensitiveComparator
implements Comparator {
public int compare(Object element1,
Object element2) {
String lower1 = element1.toString().
toLowerCase();
String lower2 = element2.toString().
toLowerCase();
return lower1.compareTo(lower2);
}
}

public static void main(String args[]) {
String words[] =
{"man", "Man", "Woman", "woman",
"Manana", "manana", "ma?ana", "Ma?ana",
"Mantra", "mantra", "mantel", "Mantel"
};

// Create frame to display sortings
JFrame frame = new JFrame("Sorting");
frame.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
Container contentPane = frame.getContentPane();
JTextArea textArea = new JTextArea();
JScrollPane pane = new JScrollPane(textArea);
contentPane.add(pane, BorderLayout.CENTER);

// Create buffer for output
StringWriter buffer = new StringWriter();
PrintWriter out = new PrintWriter(buffer);

// Create initial list to sort
List list = new ArrayList(Arrays.asList(words));
out.println("Original list:");
out.println(list);
out.println();

// Perform default sort
Collections.sort(list);
out.println("Default sorting:");
out.println(list);
out.println();

// Reset list
list = new ArrayList(Arrays.asList(words));

// Perform case insensitive sort
Comparator comp = new CaseInsensitiveComparator();
Collections.sort(list, comp);
out.println("Case insensitive sorting:");
out.println(list);
out.println();

// Reset list
list = new ArrayList(Arrays.asList(words));

// Perform collation sort
comp = new CollatorComparator();
Collections.sort(list, comp);
out.println("Collator sorting:");
out.println(list);
out.println();

// Fill text area and display
textArea.setText(buffer.toString());
frame.pack();
frame.show();
}
}

위 내용은 Java 목록 정렬 기능을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제