【问题标题】:Convert String array to StringBuilder array将 String 数组转换为 StringBuilder 数组
【发布时间】:2020-05-19 07:41:14
【问题描述】:

除了使用循环之外,还有什么快速的方法可以将 String 数组转换为 StringBuilder 数组吗?
假设我有这个字符串数组:

String[] str = new String[] {"hi","hello"};

我需要创建一个具有相同文字的StringBuilder 数组。

【问题讨论】:

  • 流和地图?
  • 你想要StringBuilder[]吗?真的吗?做什么的?如果您希望 String[] 快速转换为由单个空格分隔的单个 String,请执行 string sentence = String.join(" ", str);...
  • 我想我们这里有一个XY Problem。你能解释一下为什么你想要一个StringBuilders数组吗?你认为这会解决什么问题?
  • 除了使用循环之外? - 它们是不兼容的类型,因此转换必须按元素进行,即使其他人为其编写循环。
  • 也许使用 StringBuilder 作为转换阶段之一是个好主意,但除非编辑在元素之间相互依赖,否则您不需要字符串构建器数组。您可以执行一个循环来进行转换,无论是声明性循环还是流。无需保留 StringBuilders 并再次循环。

标签: java arrays string stringbuilder


【解决方案1】:

Arrays.setAll() 好像是最简单的,打字可能比循环短:

    String[] str = new String[] {"hi","hello"};
    StringBuilder[] sbs = new StringBuilder[str.length];
    Arrays.setAll(sbs, i -> new StringBuilder(str[i]));

甚至还有parallelSetAll(),但我认为,为了简单地创建对象,它必须是一个非常长的数组才能从并行性中获益。

你不会相信它的内部是什么样子:

public static <T> void setAll(T[] array, IntFunction<? extends T> generator) {
    Objects.requireNonNull(generator);
    for (int i = 0; i < array.length; i++)
        array[i] = generator.apply(i);
}

(并行使用IntStream.range().parallel().forEach()


原始答案
在制作这些线的过程中没有损坏回路:
String[] str = new String[] {"hi","hello"};
StringBuilder[] sbs=Arrays.stream(str)
                          .map(s->new StringBuilder(s))
                          //.collect(Collectors.toList()) // not needed, see comments
                                                          // of @RealSkeptic and @Holger
                          .toArray(StringBuilder[]::new);

所以是的,当然,它可以在不编写单个循环语句的情况下完成。 现在在后台会有两个循环,一个用于将StringBuilders 创建为List,另一个用于将其转换为数组。而且我仍然不会称它为特别漂亮either,尤其是考虑到最后也会出现类似的一堆线条,用于另一个方向。


如果修改是独立的,并且末端必须保持数组,我确实会使用单个“经典”索引for 循环,在正文中执行所有操作:
String[] str = new String[] {"hi","hello"};
for(int i = 0; i < str.length; i++) {
  StringBuilder sb = new StringBuilder(str[i]);
  ...magic...
  str[i] = sb.toString(); // or perhaps into a new array
}

【讨论】:

  • 在您的流解决方案中,无需先收集到列表然后再收集到数组。 Stream 有自己的 toArray 方法,其工作原理完全相同。
  • 换句话说,StringBuilder[] sbs = Arrays.stream(str).map(StringBuilder::new).toArray(StringBuilder[]::new); 实际上,在 Java 11 之前,.toArray(StringBuilder[]::new) 只适用于 Stream
  • 谢谢。 每个评论只能有一个 @,所以我只是在修改中提到了你们两个,而这一行中没有一个。
猜你喜欢
  • 2013-06-21
  • 2011-04-06
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 2015-02-12
  • 1970-01-01
相关资源
最近更新 更多