将地图中的列表展平为单个列表

Kau*_*era 3 java list hashmap

我在map下面定义了一个像,它有字符串列表作为值

Map<Integer,List<String>> MapOf_words_arrays = new HashMap<Integer,List<String>>();
Run Code Online (Sandbox Code Playgroud)

我需要将上面 Map 的值放入一个字符串数组中(例如如下所示),。

["dog","cat"]
["book","pen","phone","waterbottle"]
.
.
.etc
Run Code Online (Sandbox Code Playgroud)

我正在使用以下语句

String wordlists = MapOf_words_arrays.values().toArray(new String[0]);
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误

线程“main”中的异常 java.lang.ArrayStoreException: java.util.ArrayList$SubList at java.util.AbstractCollection.toArray(AbstractCollection.java:196) at ScrapePages.main(ScrapePages.java:98)

有人可以帮我吗?

Zab*_*uza 5

解释

ArrayStoreException意味着您试图将错误类型的元素存储到错误类型的数组中(请参阅其文档)。

你在打电话

values().toArray(new String[0])
Run Code Online (Sandbox Code Playgroud)

因此,您尝试将某些内容存储到一个接受String其元素的数组中。但是在您的情况下Map#values不会返回String,它会返回一个Collection包含类型的元素List<String>。这就是为什么它想要一个 type 的数组List,而不是String.


解决方案

首先,您需要拼合所有子列表为一体。为此,您有多种选择。最直接的解决办法是迭代的所有元素,然后将它们添加到另一个List,然后转换此表到数组

List<String> valuesFlatten = new ArrayList<>();

// Flatten all values
for (List<String> valueContainer : MapOf_words_arrays.values()) {
    valuesFlatten.addAll(valueContainer);
}

// Create and fill the array
String[] result = new String[valuesFlatte.size()];
valuesFlatten.toArray(result);
Run Code Online (Sandbox Code Playgroud)

或者更紧凑,使用Streams ( Java 8 )的解决方案:

String[] result = MapOf_words_arrays.values().stream()  // List<String>
    .flatMap(List::stream)                              // String
    .toArray(String[]::new)
Run Code Online (Sandbox Code Playgroud)