【问题标题】:Convert Set<Integer> to Set<String> in Java在 Java 中将 Set<Integer> 转换为 Set<String>
【发布时间】:2011-08-22 16:33:27
【问题描述】:

有没有一种简单的方法可以将Set&lt;Integer&gt; 转换为Set&lt;String&gt; 而无需遍历整个集合?

【问题讨论】:

标签: java string integer set


【解决方案1】:

没有。最好的方法是循环。

HashSet<String> strs = new HashSet<String>(ints.size());
for(Integer integer : ints) {
  strs.add(integer.toString());
}

简单、相对快速、直接且富有表现力的东西可能是最好的。

(更新:)在 Java 8 中,如果您想隐藏循环,可以使用 lambda 表达式完成相同的操作。

HashSet<String> strs = new HashSet<>(ints.size());
ints.forEach(i -> strs.add(i.toString()));

或者,使用流,

Set<String> strs = ints.stream().map(Integer::toString).collect(toSet());

【讨论】:

  • 也许你的意思是 toString 而不是 stringValue ;)
  • @Peter 我确实做到了。我一定在想Integer.intValue()
  • 理论上,您的代码可以在对toString() 的调用中抛出NullPointerException,因为Set&lt;T&gt; 可以包含空值。
  • @Luke 是的,但是,因为这是一个例子,处理它并不重要,老实说,即使在生产代码中我也不会处理它,直到它被证明是一个问题。如果您知道输入集不会有任何空值,为什么还要麻烦?
  • @Luke,因此我更喜欢较短的""+integer ;)
【解决方案2】:

使用 Java8 流图并收集能力:

 Set< String >  stringSet = 
   intSet.stream().map(e -> String.valueOf(e)).collect(Collectors.toSet());

【讨论】:

    【解决方案3】:

    在 Java 8 中使用 Eclipse Collections

    Set<String> strings = IntSets.mutable.with(1, 2, 3).collect(String::valueOf);
    

    这不需要将 int 值和 Integer 装箱,但如果需要,您也可以这样做:

    Set<String> strings = Sets.mutable.with(1, 2, 3).collect(String::valueOf);
    

    Sets.mutable.with(1, 2, 3) 将返回 MutableSet&lt;Integer&gt;,而 IntSets.mutable.with(1, 2, 3) 将返回 MutableIntSet

    注意:我是 Eclipse Collections 的提交者。

    【讨论】:

      【解决方案4】:

      Java 7 + Guava(估计没办法切换到 Java 8)。

      new HashSet<>(Collections2.transform(<your set of Integers>, Functions.toStringFunction()))
      

      【讨论】:

        【解决方案5】:
        private static <T> Set<T> toSet(Set<?> set) {
            Set<T> setOfType = new HashSet<>(set.size());
            set.forEach(ele -> {
                setOfType.add((T) ele);
            });
            return setOfType;
         }
        

        【讨论】:

          【解决方案6】:

          AFAIK,您必须遍历集合;尤其是当涉及不自然的转换时。即,如果您尝试从 Set-Timestamp- 转换为 Set-Date-;您可以使用 Java 泛型的某种组合来实现这一点(因为时间戳可以转换为日期)。但是由于 Integer 不能转换为 String,所以需要迭代。

          【讨论】:

          • 可能有人不同意“否”的答案,并认为包装器/装饰器是更好的答案。
          【解决方案7】:

          您可以自己实现Set&lt;String&gt; 并将所有调用重定向到原始集合,仅在需要时处理必要的转换。取决于该组的使用方式,它的表现可能明显更好或更差。

          【讨论】:

            【解决方案8】:

            您可以使用 Commons Collections 的 TransformedSet 或 Guava 的 Collections2.transform(...)

            在这两种情况下,您的仿函数可能会简单地调用整数的 toString()。

            【讨论】:

              【解决方案9】:

              如果你真的不想遍历整个集合,你可以使用装饰器

              【讨论】:

              • 你能举个例子吗?我不熟悉装饰器的概念。
              • 在这种情况下你会如何应用装饰器模式?
              • 如果我们只是想让一个 Set 看起来像一个 Set 但不创建另一个集合(例如,如果可能只检查集合的一小部分),您将创建一个子类的 AbstractSet 将包装 Set 并在各个方法中进行转换。
              • 嗯,这取决于 Mat 的需要。对于单个需求(功能),我可能会创建一个包含集合并实现我所需功能的简单对象。对于不止一个需求,我可能会选择另一种解决方案:)
              【解决方案10】:

              没有。您必须格式化每个整数并将其添加到您的字符串集中。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-04-26
                • 1970-01-01
                • 2021-06-22
                • 1970-01-01
                相关资源
                最近更新 更多