【问题标题】:Best way to cast Iterator<Object> to a Set<String>, for instance例如,将 Iterator<Object> 转换为 Set<String> 的最佳方法
【发布时间】:2012-05-14 10:26:38
【问题描述】:

Iterator&lt;Object&gt; 转换为Set&lt;String&gt;

最干净/最佳实践方式是什么?

【问题讨论】:

  • 我不明白编辑,这不是泛型的问题。即使您不使用泛型,也应该平等地进行转换,示例中使用泛型来帮助观众,但是如果您删除所有标签,问题/问题仍然存在
  • 对不起,我试着解释得更好。删除泛型/类型并尝试使其在没有注释或警告的情况下编译。我知道我可以循环、迭代和复制每个值,但我正在寻找一个潜在的隐藏的酷解决方案。
  • 我做了一个编辑,让一切变得容易理解
  • 我认为这将是一个不错的解决方案,我查看了 API,但我希望可能以某种方式在没有迭代的情况下排成一行,泛型加强制转换可以很好地工作
  • 你是对的对不起,现在问题更简单了,我举了一个例子,没有歧义。我的意思是这不仅是泛型的事情,而且是内部类型的转换,因为我的迭代器类型是 而不是 并且我必须在下面返回一个转换后的集合。好吧,忘记它,把新的编辑作为正确的问题

标签: java generics casting iterator set


【解决方案1】:
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;
}

当然,如果迭代器返回的所有As 都不是Bs,它会失败。

如果要过滤迭代器,则使用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));

【讨论】:

    【解决方案2】:

    我仍然不能 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】:

      如果我们谈论需要使用它们的iteratorscollections,并且您需要iterater 足够通用,以便它可以被不同的collections 使用。
      只需将if/elseinstanceof 关键字一起使用,如下所示:

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

      【讨论】:

      • 我不是反对者,但在某种程度上我可以理解他/她。这段代码不是很干净,我没有看到很多用例。
      【解决方案4】:

      这可能是唯一的方法。

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

      【讨论】:

        【解决方案5】:

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

        这是一个将迭代器转换为集合的示例;

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

        【讨论】:

          【解决方案6】:

          不能将迭代器直接转换为 Set。迭代器模式提供了顺序访问聚合对象的元素而不暴露其底层表示的方法。可能的解决方案是依次遍历每个元素并将每个元素添加到集合中

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

          【讨论】:

          • 我的意思是转换为内部类型。如果 Object 没有 toString 方法,则需要强制转换(最初的问题是 A 和 B 类型)。如果我错了,请纠正我。
          猜你喜欢
          • 2011-07-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-22
          相关资源
          最近更新 更多