在java中向类映射添加方法列表

时间:2018-02-23 19:35:14

标签: java

我有一个值列表,用于将方法名称与类名联系起来。

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]}

有人可以帮忙迭代上面的列表并添加到地图吗?

2 个答案:

答案 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
        }
    }