我有一个值列表,用于将方法名称与类名联系起来。
Ex:method1#class1
现在,我想创建一个映射,其中键是类名,值是方法名列表。示例代码如下。
Map<String, List<String>> map = new HashMap<>();
List<String> name = new ArrayList<>();
name.add("method1#class1");
name.add("method2#class1");
name.add("method3#class2");
name.add("method4#class2");
所以,基于上面的例子,我需要创建一个应该包含的地图 {class1:[method1,method2]} {class2:[method3,method4]}
有人可以帮忙迭代上面的列表并添加到地图吗?
答案 0 :(得分:3)
您可以将流与groupingBy
收集器结合使用:
Map<String, List<String>> result = name.stream()
.map(s -> s.split("#")) // split string by '#'
.collect(
Collectors.groupingBy(arr -> arr[1], // second element is the key
Collectors.mapping(arr -> arr[0], // first element is the value
Collectors.toList()))); // collect values with the same key into a list
System.out.println(result); // {class2=[method3, method4], class1=[method1, method2]}
答案 1 :(得分:0)
我在对代码的评论中做了所有解释:
Map<String, List<String>> map = new HashMap<>();
List<String> name = new ArrayList<>();
name.add("method1#class1");
name.add("method2#class1");
name.add("method3#class2");
name.add("method4#class2");
for(String nm : name) { // for each String from name list...
String[] splitted = nm.split("#"); // split this string on the '#' character
if(map.containsKey(splitted[1])) { // if result map contains class name as the key...
map.get(splitted[1]).add(splitted[0]); // get this key, and add this String to list of values associated with this key
} else { // if result map doesn't contain that class name as key...
map.put(splitted[1], new ArrayList<String>()); // put to map class name as key, initialize associated ArrayList...
map.get(splitted[1]).add(splitted[0]); // and add method name to ArrayList of values
}
}