将Iterator <object>强制转换为Set <string>的最佳方法,例如</string> </object>

时间:2012-05-14 10:26:39

标签: java generics casting iterator set

Iterator<Object>投射到Set<String>

什么是最干净/最佳的做法?

6 个答案:

答案 0 :(得分:7)

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都不是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;
}

使用番石榴,上面的内容可以简化为

return Sets.newHashSet(Iterators.filter(myFunc.iterator(), B.class));

答案 1 :(得分:3)

如果我们讨论需要使用它们的iteratorscollections,并且您需要iterater足够通用,以便它可以被不同的{{1}使用}。
只需使用collections if/else关键字,如下所示:

instanceof

答案 2 :(得分: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;
}

答案 3 :(得分:1)

这可能是唯一的方法。

while(iterator.hasNext()) {
  Object o = iterator.next();
  if (o instanceof B) {
    collection.add((B) o);  
  }
}

答案 4 :(得分:1)

org.apache.commons.collections.IteratorUtils可用于执行此操作。

以下是将迭代器转换为set;

的示例
Set<String> mySet = new HashSet<String>(IteratorUtils.toList(myIterator))

答案 5 :(得分:0)

无法将Iterator强制转换直接设置。 Iterator模式提供了顺序访问聚合对象元素的方法,而不会暴露其底层表示。可能的解决方案是顺序遍历每个元素并将每个元素添加到集合

while (iterator.hasNext()) {
    Object obj = iterator.next();
    set.add(obj.toString());
}