7
4

6 に答える 6

8
public Set<B> getBs(){
    Iterator<A> iterator = myFunc.iterator();
    Set<B> result = new HashSet<B>();
    while (iterator.hasNext()) {
        result.add((B) iterator.next();
    }
    return result;
}

Aしかしもちろん、イテレータによって返されるすべての s が s でない場合は失敗しますB

イテレータをフィルタリングする場合は、instanceof を使用します。

public Set<B> getBs(){
    Iterator<A> iterator = myFunc.iterator();
    Set<B> result = new HashSet<B>();
    while (iterator.hasNext()) {
        A a = iterator.next();
        if (a instanceof B) {
            result.add((B) iterator.next();
        }
    }
    return result;
}

Guava を使用すると、上記を次のように減らすことができます。

return Sets.newHashSet(Iterators.filter(myFunc.iterator(), B.class));
于 2012-05-14T10:34:04.000 に答える
3

私はあなたが何を望んでいるのかまだ100%確信が持てませんが、これをチェックして見てください:

public static void main(String[] args) {
  final Iterator<?> it = Arrays.asList(new Object[] {"a", "b", "c"}).iterator();
  System.out.println(setFromIterator(it));
}

public static Set<String> setFromIterator(Iterator<?> it) {
  final Set<String> s = new HashSet<String>();
  while (it.hasNext()) s.add(it.next().toString());
  return s;
}
于 2012-05-14T10:50:03.647 に答える
1

org.apache.commons.collections.IteratorUtilsこれを行うために使用できます。

イテレータをセットに変換する例を次に示します。

Set<String> mySet = new HashSet<String>(IteratorUtils.toList(myIterator))
于 2013-08-02T11:50:32.803 に答える
1

それが唯一の方法です、おそらく。

while(iterator.hasNext()) {
  Object o = iterator.next();
  if (o instanceof B) {
    collection.add((B) o);  
  }
}
于 2012-05-14T10:34:16.393 に答える
0

Iterator を Set に直接キャストすることはできません。イテレータ パターンは、基になるプレゼンテーションを公開せずに、集計オブジェクトの要素に順番にアクセスする方法を提供します。可能な解決策は、各要素を順番に移動し、各要素をセットに追加することです

while (iterator.hasNext()) {
    Object obj = iterator.next();
    set.add(obj.toString());
}
于 2012-05-15T13:09:57.017 に答える