2016-11-01 6 views
1

私は値がTreeSetであるTreeMapを持っています。今、私は鍵をループする必要がある、とTreeSetのの各要素のために、私はその要素を削除する必要があります(そして、何かをし続ける)、その後、私が試したTreeMapを値としてTreeSetを使用し、このTreeSetから要素を削除する方法は?

そのTreeSetのなどの2番目の要素を削除:

for (Integer w : adjacencyList.get(keyNow)){   
    adjacencyList.get(keyNow).remove(w); 
} 

これは機能しません、誰かが助けてくれますか?

+0

あなたはグアバの多重集合(https://google.github.io/guava/releases/17.0/api/docs/com/google/common/collect/SortedMultiset.html)を使用して検討しています。 – benehsv

答えて

3

は、明示的なイテレータを使用しますエランの答え@と同様に

if (adjacencyList.containsKey(keyNow)) { 
    Iterator<Integer> iter = adjacencyList.get(keyNow).iterator(); 
    while (iter.hasNext()) { 
     Integer w = iter.next(); 
     iter.remove(); 
    } 
} 
+0

私のコードでエラーが発生した理由を説明できますか?なぜなら、新しいコードと古いコードはどちらも同じように動作すると思われるからですが、なぜ古いコードが動作しなかったのかを正確に把握することはできません。 – Camille

+1

@Jorane Setから要素を削除しながら強化されたforループは独自のイテレータを作成し、その要素を削除するとそのイテレータの状態が無効になるため、拡張forループは許可されません。イテレータのremoveメソッドを明示的なイテレータで反復しながら使用すると、この問題が解決されます。 – Eran

1

を、私はこのようにそれを記述します。

Set<Integer> ints = adjacencyList.get(keyNow); 
if (ints != null) { 
    for (Iterator<Integer> iter = ints.iterator(); iter.hasNext();) { 
     Integer w = iter.next(); 
     // do something with w 
     iter.remove(); 
    } 
} 

注:各値を調べる必要がない場合は、そのセットをクリアすることができます。

Set<Integer> ints = adjacencyList.get(keyNow); 
if (ints != null) 
    ints.clear(); // remove all. 
関連する問題