【问题标题】:How to create an array of array list? [closed]如何创建数组列表的数组? [关闭]
【发布时间】:2020-07-03 18:20:36
【问题描述】:

您好,我刚遇到一个关于我正在解决的排序问题的问题。我需要列出一个单词并按第一个字符对它们进行排序。所以基本上我正在创建一个包含每个字母的数组,其中包含一个列表。例如,在数组的位置 0,我可以有一个以 A 开头的单词列表。对于位置 1,它将是以 b 开头的单词。我想出了如何通过精装每个字母的一堆 if 语句来做到这一点。我想我的问题是,有没有一种更简单的方法来实现这一点,而不必为每个字母硬编码 27 个 if 语句?

【问题讨论】:

  • 使用Map<Character, List<String>>。无需使用任何 if 语句。
  • 显示一个起点示例。你有一个包含单词的String 吗?或者您有List 或单字字符串?

标签: java arrays list


【解决方案1】:

这可以通过 Java Streams API 很好地完成。您要求的操作称为分组(按)

下面的代码将流过split 创建的数组的所有元素,将元素放入由给定函数定义的组中。下面的代码使用str -> str.charAt(0)作为函数,它的基本意思是“从元素str中获取第一个字符,这标识了组”,也就是key

Map<Character, List<String>> map = Arrays.stream(line.split(" "))
    .groupingBy(str -> str.charAt(0));

上述代码使用函数式编程风格。不是每个人都熟悉这种风格,所以下面你会找到使用传统风格的解决方案。

Map<Character, List<String>> map = new HashMap<>();
String[] words = line.split(" ");
for (String word : words) {
    char first = word.charAt(0);
    if (!map.containsKey(first)) {
        map.put(first, new ArrayList<>());
    }
    map.get(first).add(word);
}

为什么是地图?为什么不只是一个 ArrayList?

map 的查找性能更好(时间复杂度 O(1)),而使用 List 则需要遍历列表(时间复杂度 O(n) )。


使用 charAt(0) 我假设没有一个词是空的,即长度为 0。

【讨论】:

  • 这假设单词列表实际上是一个由空格分隔的大字符串。如果您的单词列表已经是List&lt;String&gt;,那么它就是words.stream().groupingBy(str-&gt;str.charAt(0));
  • @BasilBourque 是的,我正打算这样做。我会将其包含在答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2016-02-25
相关资源
最近更新 更多