2011-01-07 3 views
3

add(); remove(); clear(); iterator(); 메서드에 HashSet을 사용합니다. 지금까지 모든 것이 매력처럼 작동했습니다. 그러나 이제는 다른 요구 사항을 충족해야합니다.HashSet 용 무작위 시작 인덱스 반복기

특정 인덱스에서 반복을 시작할 수 있기를 바랍니다. 예를 들어, 다음과 같은 두 개의 프로그램이 동일한 출력을 가지길 원합니다.

프로그램 1

Iterator it=map.iterator(); 
for(int i=0;i<100;i++) 
{ 
    it.next(); 
} 
while (it.hasNext()) 
{ 
    doSomethingWith(it.next()); 
} 

프로그램이

Iterator it=map.iterator(100); 
while (it.hasNext()) 
{ 
    doSomethingWith(it.next()); 
} 

내가 프로그램 1을 사용하지 않는 이유는 불필요한 오버 헤드를 생성한다는 것이다. 필자의 연구에서 시작 인덱스를 가진 반복자를 만드는 실용적인 방법을 찾지 못했습니다.

내 질문에, 오버 헤드를 최소화하면서 목표를 달성하기위한 좋은 방법은 무엇입니까?

감사합니다.

+0

어떤 종류의 데이터 구조를 사용 하시겠습니까? – Xorty

+0

위에 나열된 작업을 지원하는 한 데이터 구조는 중요하지 않습니다. 그러나, 나는 그것을 단순 ArrayList보다 빠르다 (덜 복잡하다) 싶다. –

답변

5

add(), remove()이 빠르게 HashSet에있는 이유가있다. 세트의 요소를 속도 및 메모리 비용에 대한 임의 액세스 목록으로 취급하는 기능을 거래하고 있습니다.

내가 먼저 세트를 목록으로 변환하지 않으면 실제로 그렇게 할 수 없습니다. 이것은 간단하지만 Set의 모든 요소를 ​​완벽하게 처리하는 것이 일반적입니다. 특정 위치에서 반복자를 시작하는 기능이 한 번 이상 동일한 상태를 형성하기를 원한다면 말이 될 수 있습니다. 그렇지 않다면 아마 현재의 접근 방식으로 나아질 것입니다. 코드 이제

그리고

이 ( Set<Integer> set = new HashSet<Integer>();이 선언 된 데이터 구조입니다 가정 :

List<Integer> list = new ArrayList<Integer>(set); 
list.subList(100, list.size()).iterator(); // this will get your iterator. 
1

NavigableMap을 사용할 수 있습니다. 키에 의지 할 수 있고 특정 키에서 시작할 수 있다면 그 상자에서 벗어날 수 있습니다.

Map<K,V> submap = navigableMap.tailMap(fromKey); 

그런 다음 결과 서브맵을 사용하여 반복기()를 간단하게 가져와 사용하십시오. 그렇지 않으면 일부 색인에서 시작해야하는 경우 임시 목록을 사용해야 할 수도 있습니다.

K fromKey = new ArrayList<K>(navigableMap.keySet()).get(index); 

위와 같이 서브맵을 가져옵니다.

2

HashSet에는 순서가 없습니다. 그래서 당신은 인덱스를 사용할 수있는리스트에 세트를 넣을 수 있습니다.

예 :

HashSet set = new HashSet(); 
//...... 
ArrayList list = new ArrayList(set); 
2

HashSet의 반복자 이후로는 특별한 순서없이 항목을 생산, 정말 당신이 드롭 여부를 어떤 차이가되지 않습니다 처음부터 또는 끝에서 100 개 항목.

끝에서 항목을 삭제 빠르게 될 것입니다.

Iterator it = map.iterator(); 
int n = map.size() - 100; 
for (int i = 0; i < n; i++) 
    doSomethingWith(it.next()); 
0

FOLLO 날개 @ toader의 제안.

for(Integer i : new ArrayList<Integer>(set).subList(100, set.size())) { 
    // from the 100'th value. 
} 

참고 : n 번째 값은 HashSet에서 의미가 없습니다. 아마도 SortedSet이 필요합니다.이 경우 100 번째 값은 100 번째 값입니다.