我想将 NxN 数组映射到 Java 8 中的 Map。
想法是每个 [i][0] 元素都是一个键,每个 [i][j] 且 j>0 是映射中每个键的值列表。
感谢您的帮助。 :)
这是我的课:
public class GroupingDishes {
public static void main(String[] args) {
String[][] dishes = {
{"Salad", "Tomato", "Cucumber", "Salad", "Sauce"},
{"Pizza", "Tomato", "Sausage", "Sauce", "Dough"},
{"Quesadilla", "Chicken", "Cheese", "Sauce"},
{"Sandwich", "Salad", "Bread", "Tomato", "Cheese"}
};
Map<String, HashSet<String>> groupDishes = groupingDishes(dishes);
}
public static Map<String, HashSet<String>> groupingDishes(String[][] dishes) {
Map<String, HashSet<String>> mapFood = new HashMap<>();
for (int i = 0; i < dishes.length; i++) {
String food = dishes[i][0];
for (int j = 0; j < dishes[i].length; j++) {
if (mapFood.containsKey(food)) {
HashSet<String> existingIngredients = mapFood.get(dishes[i][0]);
existingIngredients.add(dishes[i][j]);
mapFood.put(food, existingIngredients);
} else {
HashSet<String> newIngredient = new HashSet<>();
mapFood.put(food, newIngredient);
}
}
}
return mapFood;
}
}
最佳答案
您可以转换 String[][]
到 String[]
的流,
然后收集到一张 map ,
使用 String[]
的第一项作为关键,
其余的作为集合的值。
public static Map<String, HashSet<String>> groupingDishes2(String[][] dishes) {
return Arrays.stream(dishes)
.collect(Collectors.toMap(
arr -> arr[0],
arr -> Arrays.stream(arr).skip(1).collect(Collectors.toCollection(HashSet::new))));
}
顺便说一句,我怀疑你真的需要 Map<String, HashSet<String>>
.
最好将类型更改为 Map<String, Set<String>>
,
然后实现也可以写得更简单。
public static Map<String, Set<String>> groupingDishes(String[][] dishes) {
return Arrays.stream(dishes)
.collect(Collectors.toMap(
arr -> arr[0],
arr -> Arrays.stream(arr).skip(1).collect(Collectors.toSet())));
}
或者甚至更好,正如@Holger 所建议的,一个更好的选择,因为“带有skip
和limit
的流表现不是很好,而且Collectors
没有得到任何结果初始值的提示容量”:
public static Map<String, Set<String>> groupingDishes(String[][] dishes) {
return Arrays.stream(dishes)
.collect(Collectors.toMap(
arr -> arr[0],
arr -> new HashSet<>(Arrays.asList(arr).subList(1, arr.length))));
}
关于Java 8 : Filter an Array(NxM) to create a Map<String, 哈希集<字符串>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47442973/