【问题标题】:Initiate a List taking character arrays, coming from a String array [duplicate]启动一个接收字符数组的列表,来自一个字符串数组[重复]
【发布时间】:2021-11-02 16:16:46
【问题描述】:

我认为显示我的代码更容易理解我的意思

        String[] words = text.split(" ");

        List<char[]> wordsInChars = new ArrayList<char[]>();
        for(String i: words){
            wordsInChars.add(i.toCharArray());
        }

所以我创建了一个字符串数组,将 text 变量作为输入,然后我想 将其传递给列表而不经过该循环。是否可以完全跳过 for 循环?

我试过了

List<char[]> wordsInChars = Arrays.asList(Arrays.stream(words).forEach(w -> w.toCharArray()));

无论哪种方式,应该使用哪种方法?带有 for 循环的代码可以工作,但不确定是否只在声明时执行所有操作会更好。

编辑:我实际上管理过

List<char[]> wordsInChars = Arrays.stream(words).map(w -> w.toCharArray()).collect(Collectors.toList());

但欢迎就两者中哪一个更好的做法提供反馈。

【问题讨论】:

  • Is it possible to skip the for loop altogether? 不。即使等效的流仍然包含一个循环,只是一个更难看到。
  • 还要小心,因为它们并不等同。 Arrays.asList 不返回 ArrayList(实际上它返回一个不可变列表)。

标签: java arrays list


【解决方案1】:

快速回答是否定的。您正在将 string[] 转换为 List 并且无论您是自己编写循环还是调用一些为您执行循环的方法,都需要一个循环来迭代并转换这些值。我们实际上可以争辩说多个循环是必要的,因为String.toCharArray() 方法还遍历字符串中的每个字节,以便使用正确的编码将其转换为char。 话虽如此,在代码中使用循环并没有错。除非您的代码被非常频繁地调用,否则您甚至不会注意到执行时间的差异。

【讨论】:

    【解决方案2】:

    这是一种不同的方式,但它内部仍然有一个循环,所以我们实际上并没有跳过这个循环。

      String words = "This is some text I made.";
      List<char[]> s = Pattern.compile( "\\s+" ).splitAsStream( words ).map( String::toCharArray ).toList();
      for( char[] c : s ) 
         System.out.println( Arrays.toString( c ) );
    

    【讨论】:

    • List&lt;char[]&gt; wordsInChars = Arrays.stream(words).map(w -&gt; w.toCharArray()).collect(Collectors.toList()); 为我工作,地图以某种方式完全逃过了我的脑海。
    • 不同之处在于我不是从一个字符串数组开始,而是从一个完整的字符串开始,然后将其拆分为一行,然后将 char[] 放在一行中。
    • 非常正确,我绝对喜欢这种方法。
    猜你喜欢
    • 2012-07-20
    • 2018-10-26
    • 2017-02-13
    • 1970-01-01
    • 2017-03-31
    • 2018-05-12
    • 2016-07-28
    • 2017-05-25
    • 2015-08-22
    相关资源
    最近更新 更多