정렬 세트의 마지막 25 개 요소를 얻는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/581677

  •  06-09-2019
  •  | 
  •  

문제

Java에는 100,000 개의 요소가있을 수있는 정렬 세트가 있습니다. 마지막 25 가지 요소를 효율적이고 우아하게 얻고 싶습니다. 나는 약간 당황했다.

얻기 위해 첫 번째 25 나는 25 개의 요소를 반복하고 멈췄다. 그러나 나는 역순으로 반복하는 방법을 모른다. 어떤 아이디어?

SortedSet<Integer> summaries = getSortedSet();
// what goes here :-(
도움이 되었습니까?

해결책

당신은 필요합니다 NavigableSet. 그렇지 않으면 당신은 전체를 반복하여 비효율적으로해야합니다. SortedSet 그리고 요소를 a로 수집합니다 Queue 25 요소로 계속 다듬어진다.

다른 팁

SINTEDSET<T> 매우 간단한 반복 모델을 전달하는 것으로 가정 했으므로 상단 N 항목을 찾는 것은 쉽지만 마지막 N 항목의 창을 유지하는 반복기를 통해 비용이 많이 드는 것을 찾아야합니다.

항비색<T> 1.6을 추가하면이 문제가 해결됩니다 (1.4 Treeset의 유일한 SortedSet 구현은이를 구현하여 교체가 줄어 듭니다).

NavigableSet<T> set = new TreeSet<T>();
// add elements
set.descendingIterator() // iterate over the last n entires as needed

정렬을 되돌리고 처음 25 개 항목을 가져 가십시오. 그런 다음 25 개 항목으로 효율적인 것을 반전시킬 수 있습니다.

브루스

이 작업에 다른 데이터 구조가 더 적합합니다.

이것은 우아한 방법이 아니거나 매우 효율적입니다, 그러나 SortedSet이 오름차순 순서라고 가정하면 Last () 항목을 가져 와서 제거하여 다른 목록에 저장하고 25 번 반복 할 수 있습니다. 그러면이 요소들을 다시 넣어야합니다!

당신은보고 싶을 수도 있습니다 indexedtreemap 안에 색인 트리 맵

정확한 (크기 -25)를 사용하여 반복없이 인덱스의 요소에 도달하십시오.

세트를 목록에 던지고 Sublist ()를 사용하십시오. 목록을 작성하는 것이 얼마나 성능이 있는지 잘 모르겠으므로 일부 테스트를 실행해야합니다. 그래도 코딩을 쉽게 만들 것입니다.

    List f = new ArrayList( summaries);
    List lastTwentyFive = f.subList( summaries.size() - 25, summaries.size() );

나는 이것이 당신의 프로젝트에서 실제 사용이 될 가능성이 없다고 가정하지만, 단순히 목록을 반대 방향으로 정렬 할 수 있다는 것은 주목할 가치가 있습니다. :)

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