2009-03-18 1 views
1

인접 목록을 사용하는 Graph라는 사용자 정의 클래스가 있습니다. 좀 더 구체적으로 말하자면, 각 해시 맵에는 해당 노드의 모든 이웃을 에지로 포함하는 배열의 해시 맵이 있습니다. 키는 끝 노드이며 값은 Edge 개체입니다.배열에 저장된 해시 맵의 모든 요소에 대한 반복자

이제이 그래프 클래스가 Iterable을 구현하게하고 싶습니다. 모든 해시 맵을 병합하고 모든 요소에 대해 공통적 인 반복자를 반환하는 방법이 있습니까?

사용 된 방법이 효율적이라는 것은 매우 중요합니다.

답변

1

API에 따르면 HashMap에는 해시에서 매핑의 설정보기를 반환하는 entrySet()이라는 함수가 있습니다. 세트는 반복 가능한 객체입니다. 반복기를 만들려면 각 해시를 집합으로 바꾸고 각 반복자를 하나의 반복자로 구성하는 배열을 반복하면됩니다. ...

Java에서 반복자를 작성할 수있는 방법은 없습니다. 작성 기능은 사소한 것이어야합니다.

+0

이것은 실제로 내가 선택했던 것입니다. 그것은 그것이 얼마나 효율적인지 보는 것입니다. 귀하의 답변 주셔서 감사합니다! –

+0

문제 없습니다, 그것이 당신을 위해 일하기를 바랍니다 : D – kgrad

+0

그것은 충분히 빠르 것으로 보입니다. 나는 이것을 받아 들인 것으로 표시 할 것이다! 다시 한번 감사드립니다. –

6

당신은 아파치 평민 컬렉션에서 ChainedIterator를 사용할 수 있습니다

Iterator current = IteratorUtils.emptyIterator(); 
for(map: arrayOfHashmaps) { 
    current = IteratorUtils.chainedIterator(current, map.keySet().iterator); 
} 

당신이 평민에게 컬렉션을 피하려면 그냥 목록에서 키 세트를 수집하고이를 반복 할 수

List allKeys = new LinkedList(); 
for(map: arrayOfHashmaps) { 
    allKeys.addAll(map.KeySet()); 
} 
return allKey.iterator(); 

두 번째 솔루션을 약간 더 많은 메모리를 사용하게 될 것이고 조금 느려질 것입니다. 그러나 나는 그것이 중요할지 의심 스럽다.

+0

아마도 current = IteratorUtils.chainedIterator (current, map.keySet(). iterator) 여야합니다. –

+0

이것은 아마도 최선의 해결책이지만, 나는 아파치 공유 컬렉션을 사용하는 방법을 잘 모르겠습니다. 그러므로 나는 그것을 아직 받아 들일 수 없다. 그러나 귀하의 답변에 정말 감사드립니다. –

0

내가 할 방법은 Iterator를 구현하는 내부 클래스를 만드는 것입니다. 내부적으로는 1) 맵의 배열에 대한 현재 인덱스와 2) 현재 맵의 반복자를 추적합니다. 그것의 hasNext()next() 메쏘드는 단순히 현재 반복기에 위임하거나, 반복자가 끝나면 단지 색인을 증가시키고 반복자를 변경합니다.

0

다양한지도에서 반복적으로 반복되는 자신 만의 롤링을 사용하지 않는 이유는 무엇입니까?

public class MapCollection<K,V> implements Iterable<V> { 
    Map [] maps; 

    public Iterator<V> iterator(){ 
      return new MapCollectionIterator(maps); 
    } 


    private class MapCollectionIterator<T>{ 
     public boolean hasNext() { 
     public T next(){... (code omitted due to lazyness..) 
    } 

} 당신은 키가 노드 번호와 이웃 노드 번호를 모두 포함하는 객체 인 하나의 HashMap에서 그래프에 대한 모든 항목을 저장하려고 할 수있는 대안으로

0

. 나는 노드 번호가 일반적으로 HashMaps의 배열에 대한 인덱스이고, 이웃 노드는 현재의 HashMap에 대한 키라고 가정한다. 이렇게하면 지금하는 것과 동일한 검색을 수행 할 수 있으며 특수 코드를 작성하지 않고도 모든 항목을 반복 할 수 있습니다.

키로 사용되는 개체에 대해 equals() 및 좋은 해시 함수를 작성해야한다는 것을 잊지 마십시오 (다른 개체는 매우 간단 할 수 있음). 매우 큰 그래프가있는 경우 이는 당연히 적합하지 않을 수 있습니다.

+0

이것은 또한 좋은 생각입니다. 아마도 지금 사용하고있는 세트를 작성하는 방법이 시간이 오래 걸리거나 메모리가 비싼 경우에 시도해 보겠습니다. –