有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java创建映射<String,List<Integer>>

我正在尝试创建一个Map<String,List<Integer>>。这里的挑战是,如果密钥不存在,则创建列表,否则使用当前密钥添加新整数以获得当前列表。 我做了一些非常接近的事情,但我不知道如何参考当前的地图来获得列表

List<String> strList = Arrays.asList(new String[]{"even","odd"});
List<Integer> intList = Arrays.asList(new Integer[]{1,2,3,4,5,6,7});
//This is what i want returned: Map<String, List<Integer>> myMap=null;
List<Map.Entry<String,Integer>> list = strList.stream().flatMap(s -> intList.stream()
.map(i -> Maps.immutableEntry(s,i))).collect(Collectors.toList());

这些值需要通过调用下面这样的函数来创建,该函数需要三个参数:当前键、值和当前列表

static public List<Integer> testFunc(String key, Integer i, List<Integer>list){
    if(list == null){
        list = new ArrayList();
    }
    list.add(i * key.hashCode());
    return list;
}

共 (2) 个答案

  1. # 1 楼答案

    实现此行为的最简单方法是将^{}与您自己的分类器一起使用:

    Map<String, List<Integer>> map = 
        intList.stream()
               .collect(Collectors.groupingBy(x -> x % 2 == 0 ? "even" : "odd"));
    
  2. # 2 楼答案

    你的问题真的需要澄清。考虑到你迄今为止所说的一切,我的最佳猜测是,你有一个键列表,一个输入值(整数)列表一个函数,它接受一个键和一个输入整数,计算一个输出整数,并将结果整数按键添加到映射中的一个列表值

    听起来testFunc必须能够执行各种操作,而不仅仅是“偶数”和“奇数”。听起来intList中的值可以在多个List中使用,而不仅仅是划分成桶,所以在没有更好细节的情况下,我用我的想象力想象,它可能看起来像

    static Optional<Integer> testFunc(String key, int intVal){
        switch(key){
            case "even": return Optional.of(intVal).filter(i -> i % 2 == 0);  // return intVal if key is "even" and i is even
            case "odd": return Optional.of(intVal).filter(i -> i % 2 != 0);   // return intVal if key is "odd" and i is odd
            case "pos": return Optional.of(intVal).filter(i -> i > 0);        // return intVal if key is "pos" and i is positive
            case "neg": return Optional.of(intVal).filter(i -> i < 0);        // return intVal if key is "neg" and i is negative
            default: return Optional.empty();
        }
    }
    

    我在这里使用Optional,因为给定的整数i可能不适用于给定的键。如果i不适用于给定的密钥,则过滤器将Optional<Integer>减少为Optional.empty()

    下面的流将给定的键从strList直接映射到应用于它的整数列表。它通过考虑每个键来实现这一点,一次一个,并从intList中选择应用的值,并将它们收集到List

    List<String> strList = Arrays.asList("even", "odd", "pos", "neg");
    List<Integer> intList = Arrays.asList(-3, -2, -1, 0, 1, 2, 3);
    Map<String,List<Integer>> results = strList.stream()
            .collect(Collectors.toMap(s -> s, s -> intList.stream()
                        .map(i -> testFunc(s, i)).filter(Optional::isPresent).map(Optional::get)
                        .collect(Collectors.toList())
                ));
    System.out.println(results);
    

    结果是

    {neg=[-3, -2, -1], pos=[1, 2, 3], even=[-2, 0, 2], odd=[-3, -1, 1, 3]}
    

    这就是你想要的结果吗

    我一直在努力解决的问题之一是,您的“偶数”/“奇数”示例似乎对intList应用了一个谓词,只过滤偶数表示“偶数”,只过滤奇数表示“奇数”;而testFunc示例则为strList中的每个值从intList映射出一个值。如果testFunc确实需要映射值和筛选值,那么使用流很难做到这一点,因为map()filter()是独立的流操作。如果你对一个应用了filter()map()进行map()filter()Optional进行filter()处理,这就是我在上面的例子中所做的,然后应用filter(Optional::isPresent)过滤掉testFunc中不符合布尔测试的内容,然后应用filter(Optional::get)Optional包装器中打开Integer