【问题标题】:Split ArrayList of Strings into another ArrayList of Strings with the return type being a List, and not void将字符串数组列表拆分为另一个字符串数组列表,返回类型为列表,而不是 void
【发布时间】:2019-03-21 17:55:32
【问题描述】:

当给定另一个字符串数组列表时,我的代码应该返回一个单词数组列表。

例如:

输入:

["Hello there"]

输出:

["Hello","there"]

到目前为止我有:

public static List<String> stringToListOfWords(List<String> list )
        {   
            for(int i = 0; i <= list.size() - 1; i++)
            {
                String[] temp = (list.get(i).split("\\s+"));
                ArrayList<String> wordList = new ArrayList<String>(Arrays.asList(temp));

            }
            return(wordList);

        }

我尝试在 for 循环中移动 wordList,但随后我收到错误消息,指出返回类型错误。当返回类型为void 时,我让它工作,但我需要它以list 的形式返回。

任何帮助都会很棒!

【问题讨论】:

  • 如果 ArrayList&lt;String&gt; wordList 在一些花括号内声明并且没有从花括号内返回,那么它将超出范围
  • 尝试在java中读取OOP的多态性:-)

标签: java string loops arraylist return


【解决方案1】:

您应该在循环之前创建一个 ArrayList 并将循环内的所有单词添加到其中:

public static List<String> stringToListOfWords(List<String> list )
{   
    List<String> wordList = new ArrayList<> ();
    for(int i = 0; i <= list.size() - 1; i++) {
        String[] temp = list.get(i).split("\\s+");
        wordList.addAll(Arrays.asList(temp));
    }
    return wordList;

}

【讨论】:

  • 哇,感谢您的建议,我认为我的错误比需要的复杂得多!
  • 有什么理由不把i &lt;= list.size() - 1写成i &lt; list.size()吗?
  • @STaefi 两者是等价的。我选择了 OP,因为它没有任何问题。
  • @TimBiegeleisen 这不是问题,所以我认为没有必要这样做。
【解决方案2】:

您可以考虑从 Java 8 开始使用流:

public static List<String> stringToListOfWords(List<String> list){
    return list.stream()
               .flatMap(s -> Arrays.asList(s.split("\\s+")).stream())
               .collect(Collectors.toList());
}

【讨论】:

  • 您好,您能告诉我为什么您决定使用平面地图,然后将其流式传输,而不是使用常规地图,然后像我的回答那样使用平面地图吗?
  • @Rab As s.split("\\s+") 返回一个String[] 我决定制作一个 Stream,然后将其从 Stream of Stream 更改为单个流。但现在我看到了你的答案。对我来说似乎更优雅!不知何故更容易理解!
【解决方案3】:

如果您使用的是 Java 8,则可以删除循环并改用 forEach

public static List<String> stringToListOfWords(List<String> list) {
    List<String> wordList = new ArrayList<>();
    list.forEach(item->{
        String[] temp = item.split("\\s+");
        wordList.addAll(Arrays.asList(temp));
    });
    return wordList;
}

或者,如果您想使用 Streams,这里有一个衬里

public static List<String> stringToListOfWords(List<String> list) {
    return list.stream()
            .map(word -> word.split("\\s+"))
            .flatMap(Arrays::stream)
            .collect(Collectors.toList());
}

【讨论】:

  • 实际上并没有太大变化。
  • 不错的工作 +1,但是否建议从流中添加到现有列表?
  • @TimBiegeleisen 我不知道它是否推荐,但我已经编辑了我的答案,现在它不应该添加到现有列表中。
猜你喜欢
  • 2017-02-13
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2021-07-19
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多