문제

은 거기에 기존 List 구현 Java 유지 관리하는 순서에 따라 제공됩 Comparator?

가 사용할 수 있는 방법은 다음과 같습니다.

Comparator<T> cmp = new MyComparator<T>();
List<T> l = new OrderedList<T>(cmp);
l.add(someT);

someT 면 삽입되는 목록에서 순서에 따라서 관리하시는 것입니다 cmp

(에@andersoj 제안 나는 완료 내 질문에 한 번 더 요청 시)

또한 내가 원하는 수송의 목록을 정렬하기 위해 제거하지 않고 요소입니다,e:

T min = Const.SMALLEST_T;
for (T e: l) {
  assertTrue(cmp.compare(min, e) >= 0);
  min = e;
}

전달해야합니다.

모든 제안을 환영합니다(제외하고는 말을 사용하여 Collections.sort 에 정렬되지 않은 전체 목록)하지만,나는 것입아보세요 뭔가 java.* 거나 결국 org.apache.* 기 때문에 어려울 것이다 새로운 라이브러리에 있습니다.

참고:(UPDATE4) 는 것을 깨달았 구현의 이런 종류의 목록을 것이 부적절한 성능.이 두 가지 일반적인 접근 방법:

  1. 사용 연결된 구조물(정의)B 나무 또는 이와 유사한
  2. 사용 배열을 삽입(으로 검색)

1.은 문제가 CPU 캐시를 벗어났 없음 2.는 문제로 변화 요소를 배열입니다.

2: TreeSet 이 작동하지 않기 때문에 그것을 사용하여 제공되는 비교 측정기(MyComparator 는)확인을 위한 평등과에 따라 그것에서는 요소는 동일하고 그들을 제외.내가 필요로 하는 비교 측정기에 대해서만 주문하는지,"고유성을 필터링"(이후 요소에 의해 자신의 자연적인 순서 동일하지는 않)

갱신 3: PriorityQueue 로 작동하지 않습니다 List (으로 필요해요)때문에 방법이 없을 통과하는 그것이 순서대로 그것은""를 정렬을 얻기 위해 요소를 순서대로 정렬되어 있는 그들을 제거에서 컬렉션입니다.

업데이트:

비슷한 질문:
좋은 정렬된 목록을 위한 Java
정 배열 목록에서 Java

도움이 되었습니까?

해결책

응답을 새로운 요구 사항입니다.나는 두 개의 잠재력:

  • 무엇 JavaDoc 한 PriorityQueue 말합니다:

    이 클래스의 반복자를 모두 구현하는 선택적 방법의 수집 및 반복기 인터페이스가 있습니다.반복기에서 제공하는 방법 iterator() 보장되지 않을 통과하는 요소의 우선 순위 큐에서 어떤 특별한 순서입니다.해야 하는 경우 주문 traversal 사용하십시오 Arrays.sort(pq.toArray()).

    심이 수익률 최고의 성능을 주는 귀하의 요구 사항입니다.되지 않은 경우 허용하셔야 합니다 더 나은 것을 설명하려고 할 수행할 수 있습니다.

  • 목록 는 단순히 자체 종류에 따라 추가의 새로운 요소입니다.이것은 실제 고통...사용한 경우에는 연결된 구조는,당신이 할 수 있는 효율적인 삽입 정렬하지만,지역은 나쁜 것입니다.사용한 경우에는 배열업 구조,삽입 정렬은 고통 하지만 통과 더 낫습니다.는 경우 반복/회가 빈번할 수 있습을 잡고 목록의 내용을 정렬하지 않고 및 정렬할 수 있습니다.

  • 사용하십시오 PriorityQueue 으로 제안했고,이벤트에서 당신은 필요를 반복하기 위해서를 작성,래퍼로 반복기:

    class PqIter implements Iterator<T>
    {
       final PriorityQueue<T> pq;
       public PqIter(PriorityQueue <T> source)
       {
         pq = new PriorityQueue(source); 
       }
    
       @Override
       public boolean hasNext()
       {
         return pq.peek() != null
       }
    
       @Override
       public T next()
       { return pq.poll(); }
    
       @Override
       public void remove()
       { throw new UnsupportedOperationException(""); }
    }
    
  • 용 구아바의 TreeMultiSet.테스트는 다음 코드 Integer 그것이 옳은 일을 한다는 것을요.

    import com.google.common.collect.TreeMultiset;
    
    public class TreeMultiSetTest { 
      public static void main(String[] args) {
        TreeMultiset<Integer> ts = TreeMultiset.create();
        ts.add(1);  ts.add(0); ts.add(2);
        ts.add(-1); ts.add(5); ts.add(2);
    
        for (Integer i : ts) {
          System.out.println(i);
        } 
      } 
    }
    

아래 주소를 고유성/필터링에 문제가 당신을 사용하는 경우 SortedSet.나는 당신은 또한 반복기,그래서 이것은 작동하지 않습니다.

만약 당신이 정말로 원하는 것은 주문 기록 일,당신은 당신의 PriorityQueue.

Comparator<T> cmp = new MyComparator<T>();
PriorityQueue<T> pq = new PriorityQueue<T>(cmp);
pq.add(someT);

주의 API 를 설명서를 말한 시간에 대한 속성의 다양한 작업:

구현 노트:이 구현에 제공 O(로그(n)) 시간 enqueing 및 dequeing 방법(offer, poll, remove()add); 선형 시간 remove(Object)contains(Object) 방법;고 일정 시간을 검색 방법(peek, element, 고 size).

도 알고 있어야 합니다 그에 반복기에 의해 생산 PriorityQueue 하지 않는 행동 하나는 기대할 수 있습니다:

Iterator 에서 제공하는 방법 iterator() 보장되지 않을 통과하는 요소의 우선 순위 큐에서 어떤 특별한 순서입니다.해야 하는 경우 주문 traversal 사용하십시오 Arrays.sort(pq.toArray()).

나는 그냥 주는 것 구아바를 제공합 MinMaxPriorityQueue.이 구현에는 배열,백업보다는 연결된 형태에서 제공하는 JDK 의 PriorityQueue, 고 따라서 가능성이 높은 서로 다른 타이밍 동작입니다.만약 당신이 뭔가 성능에 민감할 수 있습을 살펴 보시기 바랍니다.하는 동안 주는 약간 다른(선형 및 로그)big-O 간에,모든 시간어야 또한 제한할 수 있는 유용합니다.

이 없 List 구현 per se 을 유지하는 주문,하지만 당신은 무엇을 가능성이 찾고 있의 구현 SortedSet.A TreeSet 가장 일반적입니다.다른 구현 ConcurrentSkipListSet 은 특정 사용합니다.Note SortedSet 제공하는 주문,하지만 허용하지 않는 항목을 중복하지 않는 List.

Refs:

다른 팁

당신은 아마 사용 :

요소들은 주문을 사용하여 자신의 자연적인 주문하거나 비교에서 제공하는 설정 작성 시간에 따라 생성자를 사용합니다.

예제:

Comparator<T> cmp = new MyComparator<T>();
TreeSet<T> t = new TreeSet<T>(cmp);
l.add(someT);

설정, 도록에서 중복 항목이 허용됩니다.이 작동하지 않을 수도 있습에 대한 특정 사용한 경우.

나는 비슷한 문제와 난 생각의 사용상.을 방지하 제외하고"동등한 요소"나는 수정 비교 측정기 그래서 대신의 반환 0 이 반환됩니다 임의의 숫자 사이에(-1,1)또는 그 반환 항상 1 입니다.

없는 경우에는 제어 비교 측정기는 사용하는 경우에는 그것이 다른 것보다는 다른 삽입하는 이 솔루션을 작동하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top