programing

Java에 Sorted List가 없는 이유는 무엇입니까?

firstcheck 2022. 7. 26. 00:23
반응형

Java에 Sorted List가 없는 이유는 무엇입니까?

Java에는 및 인터페이스가 있습니다.둘 다 Java Collections 프레임워크에 속하며 요소에 액세스하는 정렬된 방법을 제공합니다.

로는 없습니다.SortedList자바어.를 사용하여 목록을 정렬할 수 있습니다.

왜 그렇게 설계되었는지 아십니까?

목록 반복기는 목록의 요소를 목록의 내부 순서(삽입 순서라고도 함)로 가져올 수 있도록 보장합니다.구체적으로는 요소를 삽입한 순서 또는 목록을 조작한 방법에 따라 달라집니다.정렬은 데이터 구조를 조작한 것으로 볼 수 있으며 목록을 정렬하는 방법은 여러 가지가 있습니다.

개인적으로 본 대로 편리한 순서대로 순서를 정하겠습니다.

. 1. 을 사용하는 한다.Set ★★★★★★★★★★★★★★★★★」Bag 컬렉션

메모: 이 옵션을 맨 위에 배치하는 이유는 이 옵션이 일반적으로 필요한 작업이기 때문입니다.

정렬된 세트는 삽입 시 컬렉션을 자동으로 정렬합니다. 즉, 요소를 컬렉션에 추가하는 동안 정렬이 수행됩니다.또한 수동으로 정렬할 필요가 없습니다.

또, 중복되는 요소를 걱정할 필요가 없는(또는 가지고 있는) 경우는, 대신에 를 사용할 수 있습니다.실장하다SortedSet ★★★★★★★★★★★★★★★★★」NavigableSet인터페이스와 동작은, 리스트에서 상정되는 대로입니다.

TreeSet<String> set = new TreeSet<String>();
set.add("lol");
set.add("cat");
// automatically sorts natural order when adding

for (String s : set) {
    System.out.println(s);
}
// Prints out "cat" and "lol"

자연스러운 순서를 원하지 않는 경우 를 사용하는 생성자 매개 변수를 사용할 수 있습니다.

또는 멀티셋(백이라고 함)을 사용할 수 있습니다.즉,Set대신 중복된 요소를 허용하며, 서드파티에 의해 구현됩니다.Guava 라이브러리에서 가장 두드러지게 동작하는 것이 있습니다.TreeSet.

하기 2. 목록 정렬하기.Collections.sort()

, 「 」의 ,List스스무리무리무리무리무리무리무리무리무리무리무리무리무리무리.따라서 다양한 방법으로 분류할 수 있는 "하나의 진실원"이 필요한 상황에서는 수동으로 분류하는 것이 좋습니다.

방법을 사용하여 목록을 정렬할 수 있습니다.다음은 방법에 대한 코드 샘플입니다.

List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");

Collections.sort(strings);
for (String s : strings) {
    System.out.println(s);
}
// Prints out "cat" and "lol"

비교기 사용

한 가지 분명한 이점은 다음과 같습니다.sort자바에는 자바용 도 몇 가지 되어 있습니다.Comparator예를 들어 로케일 구분 문자열에 도움이 됩니다.예를 들어 다음과 같습니다.

Collator usCollator = Collator.getInstance(Locale.US);
usCollator.setStrength(Collator.PRIMARY); // ignores casing

Collections.sort(strings, usCollator);

동시 환경에서 정렬

, 「」를 하고 있는 해 주세요.sort수집 인스턴스가 조작되기 때문에 동시 환경에서는 메서드가 적합하지 않으므로 대신 불변의 수집을 사용하는 것이 좋습니다.이것은, Guava가 클래스내에서 제공하는 것으로, 심플한 원라이너입니다.

List<string> sorted = Ordering.natural().sortedCopy(strings);

을 3으로 합니다.java.util.PriorityQueue

Java에는 정렬된 목록이 없지만 정렬된 대기열이 있습니다.그것은 수업이다.

Nico Haase는 코멘트로 관련 질문에 링크하여 이 질문에 답변했습니다.

정렬된 컬렉션에서는 내부 데이터 구조를 조작하고 싶지 않을 가능성이 높기 때문에 우선순위가 우선됩니다.큐는 List 인터페이스를 구현하지 않습니다(이 인터페이스를 구현하면 해당 요소에 직접 액세스할 수 있기 때문입니다).

주의:PriorityQueue

PriorityQueue는 수업을 합니다.Iterable<E> ★★★★★★★★★★★★★★★★★」Collection<E>통상대로 반복할 수 있도록 인터페이스를 설정합니다.그러나 반복자가 정렬된 순서대로 요소를 반환하는 것은 보장되지 않습니다.한 바와 같이) (Alderath)가 합니다.poll()큐가 비워질 때까지 기다립니다.

수집을 수행하는 컨스트럭터를 통해 목록을 priority 큐로 변환할 수 있습니다.

List<String> strings = new ArrayList<String>()
strings.add("lol");
strings.add("cat");

PriorityQueue<String> sortedStrings = new PriorityQueue(strings);
while(!sortedStrings.isEmpty()) {
    System.out.println(sortedStrings.poll());
}
// Prints out "cat" and "lol"

4. 자신의 4를 . 신의글글글글쓰SortedList 표시

메모: 이렇게 할 필요는 없습니다.

새 요소를 추가할 때마다 정렬되는 자체 목록 클래스를 작성할 수 있습니다.이 방법은 구현에 따라 다소 계산량이 많아질 수 있으며, 연습으로 수행하려는 경우가 아니라면 의미가 없습니다. 두 가지 주요 이유로 인해 다음과 같습니다.

  1. List<E>에는, 「」가 있기 에,add방법은 요소가 사용자가 지정한 인덱스에 상주하도록 해야 합니다.
  2. 왜 바퀴를 다시 만드나요?위의 첫 번째 포인트와 같이 Tree Set 또는 Multiset을 사용해야 합니다.

할 수 . 코드 은 ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.AbstractList class: "요약 클래스:

public class SortedList<E> extends AbstractList<E> {

    private ArrayList<E> internalList = new ArrayList<E>();

    // Note that add(E e) in AbstractList is calling this one
    @Override 
    public void add(int position, E e) {
        internalList.add(e);
        Collections.sort(internalList, null);
    }

    @Override
    public E get(int i) {
        return internalList.get(i);
    }

    @Override
    public int size() {
        return internalList.size();
    }

}

필요한 메서드를 덮어쓰지 않은 경우 기본 구현은 다음과 같습니다.AbstractListUnsupportedOperationExceptions.

목록의 개념이 자동으로 정렬된 컬렉션의 개념과 호환되지 않기 때문입니다.리스트의 포인트는, 콜 후에, 에의 콜이 반환되는 것입니다.elem 자동 목록을 임의 수 자동 정렬 목록을 사용하면 요소가 임의 위치에 놓일 수 있습니다.

는 모두 에 되어 있기 에 (FIFO 순서)를 사용하여다른 로 「수 .java.util.Collections.sort().

편집:

데이터 구조로서의 리스트는, 항목이 삽입되는 순서에 근거합니다.

세트에는 이 정보가 없습니다.

는, 「」를 해 주세요.List, SortedSet.

Set 및 Map은 비선형 데이터 구조입니다.리스트는 선형 데이터 구조입니다.

여기에 이미지 설명 입력


데이터 SortedSet ★★★★★★★★★★★★★★★★★」SortedMap는 「」를 실장합니다.TreeSet ★★★★★★★★★★★★★★★★★」TreeMap각각 사용된 Red-Black 트리 구현 알고리즘을 사용합니다.따라서 중복되는 항목(또는 키)이 발생하지 않도록 합니다.Map

  • List는 이미 정렬된 수집 및 인덱스 기반 데이터 구조를 유지하고 있으며 트리는 인덱스 기반 데이터 구조가 아닙니다.
  • Tree을 사용법
  • »List.TreeList 없음)SortedList를 참조해 주세요.
  • 일람표하려면 ''을 사용해야 .java.util.Collections.sort() 요소의 자연스러운 순서에 따라 지정된 목록을 오름차순으로 정렬합니다.

바fFXSortedList

시간이 좀 걸리긴 했지만 자바8은 분류가 되어 있습니다.List. http://docs.oracle.com/javase/8/javafx/api/javafx/collections/transformation/SortedList.html

javadocs에서 볼 수 있듯이 이는 JavaFX 컬렉션의 일부이며 ObservableList에서 정렬된 보기를 제공하기 위한 것입니다.

업데이트: Java 11에서는 JavaFX 툴킷이 JDK 외부로 이동하여 별도의 라이브러리가 되었습니다.JavaFX 11은 다운로드 가능한 SDK 또는 MavenCentral에서 이용할 수 있습니다.https://openjfx.io 를 참조해 주세요.

2015년 4월 현재 Android는 지원 라이브러리에 SortedList 클래스가 있으며, 이 클래스는 다음과 같이 작동하도록 특별히 설계되었습니다.RecyclerView블로그에 올린 글입니다.

또 다른 포인트는 삽입 작업의 시간 복잡성입니다.리스트 삽입의 경우 복잡도는 O(1)가 될 것으로 예상됩니다.그러나 이것은 정렬된 목록으로는 보장할 수 없습니다.

그리고 가장 중요한 점은 리스트는 그 요소에 대해 아무것도 가정하지 않는다는 것입니다. 구현하지 않는 수 .equals ★★★★★★★★★★★★★★★★★」compare.

.「 」 「 」 「 」List인터페이스에는 다음과 같은 메서드가 있습니다.add(int index, E element),set(int index, E element)계약상 요소를 위치 X에 추가하면 그 전에 요소를 추가하거나 삭제하지 않는 한 해당 위치에 요소가 있는 것으로 되어 있습니다.

목록 구현에서 인덱스를 기반으로 하지 않는 순서로 요소를 저장하는 경우 위의 목록 메서드는 의미가 없습니다.

요소를 정렬하는 방법은 물론 인덱스로 효율적으로 액세스할 수 있는 경우 다음을 수행할 수 있습니다.

  1. 「」등).ArrayList)
  2. 항상 정렬되어 있는지 확인합니다.

그런 다음 삽입/제거 인덱스를 가져오는 데 사용할 수 있는 요소를 추가하거나 제거합니다.목록은 임의 액세스를 구현하므로, 결정된 인덱스를 사용하여 목록을 효율적으로 수정할 수 있습니다.

예:

/**
 * @deprecated
 *      Only for demonstration purposes. Implementation is incomplete and does not 
 *      handle invalid arguments.
 */
@Deprecated
public class SortingList<E extends Comparable<E>> {
    private ArrayList<E> delegate;
    
    public SortingList() {
        delegate = new ArrayList<>();
    }
    
    public void add(E e) {
        int insertionIndex = Collections.binarySearch(delegate, e);
        
        // < 0 if element is not in the list, see Collections.binarySearch
        if (insertionIndex < 0) {
            insertionIndex = -(insertionIndex + 1);
        }
        else {
            // Insertion index is index of existing element, to add new element 
            // behind it increase index
            insertionIndex++;
        }
        
        delegate.add(insertionIndex, e);
    }
    
    public void remove(E e) {
        int index = Collections.binarySearch(delegate, e);
        delegate.remove(index);
    }
    
    public E get(int index) {
        return delegate.get(index);
    }
}

( 답변에서 자세한 구현 참조)

List API의 첫 번째 줄에는 순서가 지정된 컬렉션(시퀀스라고도 함)이라고 표시됩니다.목록을 정렬하면 순서를 유지할 수 없기 때문에 Java에는 TreeList가 없습니다.
API에 따르면 Java List는 Sequence에서 영감을 받아 Sequence 속성 http://en.wikipedia.org/wiki/Sequence_(mathematics)을 참조하십시오.

목록을 정렬할 수 없다는 것은 아니지만 Java는 그의 정의에 엄격하고 기본적으로 정렬된 버전의 목록을 제공하지 않습니다.

위의 모든 것이 다음과 같은 이유로 이 질문에 답하지 않는다고 생각합니다.

  1. Tree Set, Collections, Priority 등의 다른 컬렉션을 사용하면 동일한 기능을 얻을 수 있습니다...etc(단, 이는 제약조건을 부과하는 대체 수단입니다. Set은 중복된 요소를 제거합니다. 간단히 말하면, 어떠한 제약도 가하지 않는다고 해도, Sorted List가 왜 Java 커뮤니티에 의해서 작성되지 않았는지에 대한 질문에 대답하지 않습니다.)
  2. List 요소는 비교/균등 메서드를 구현하지 않기 때문에 (일반 항목에서는 Comparable 인터페이스를 구현하지 않지만 정렬된 순서로 TreeSet/TreeMap을 사용해야 할 경우 Items는 Comparable 인터페이스를 구현해야 합니다.)
  3. List는 인덱스를 사용하기 때문에 정렬로 인해 동작하지 않습니다(중간 인터페이스/추상 클래스를 도입하여 쉽게 처리할 수 있습니다).

하지만 아무도 정확한 이유를 밝히지 않았습니다.이러한 질문들은 자바 커뮤니티 자체에서 가장 잘 대답할 수 있다고 생각합니다.그것은 하나의 구체적인 답변뿐이기 때문입니다만, 저는 다음과 같이 최선을 다해 대답하겠습니다.

아시다시피 정렬은 비용이 많이 들고 List와 Set/Map 사이에는 기본적으로 List는 중복될 수 있지만 Set/Map은 중복되지 않습니다.이것이 TreeSet/TreeMap 형식으로 Set/Map 기본 구현이 이루어진 핵심 이유입니다.내부적으로는 모든 작업(삽입/삭제/검색)이 중복으로 인해 목록이 이 데이터 스토리지 구조에 들어가지 않는 O(log N)의 복잡성을 갖는 Red Black Tree입니다.

여기서 문제가 발생합니다.또한 MergeSort와 같이 List의 기본 정렬 방법을 선택할 수도 있습니다.Collections.sort(list)O(N log N)의 복잡도를 갖는 방법.커뮤니티에서는 QuickSort, ShellSort, RadixSort 등 서로 구별되지 않는 요소의 알고리즘을 정렬하기 위해 여러 가지 선택지가 있기 때문에 이 작업을 의도적으로 하지 않았습니다.미래에는 더 많은 것이 있을 것이다.또한 동일한 정렬 알고리즘이 정렬되는 데이터에 따라 다르게 수행될 수도 있습니다.그 때문에, 이 옵션을 열어 두고 싶다고 생각하고, 선택권을 우리에게 맡겼습니다.O(log N)는 정렬 복잡도가 가장 높기 때문에 Set/Map의 경우는 해당되지 않았습니다.

https://github.com/geniot/indexed-tree-map

indexed-tree-map 사용을 검토해 주십시오.향상된 JDK의 TreeSet으로, 요소에 대한 액세스를 인덱스별로 제공하고 반복 없이 요소의 인덱스를 찾거나 트리를 백업하는 숨겨진 기본 목록을 찾을 수 있습니다.이 알고리즘은 변경이 있을 때마다 변경된 노드의 가중치를 갱신하는 것에 기초하고 있습니다.

언급URL : https://stackoverflow.com/questions/8725387/why-is-there-no-sortedlist-in-java

반응형