【问题标题】:How to work with Java map with<String, Arraylist<Integer>>如何使用 <String, Arraylist<Integer>> 处理 Java 映射
【发布时间】:2020-10-13 17:52:44
【问题描述】:

我在 java 中有一个映射,它有一个字符串作为键和一个整数列表作为值。我的查询返回以下集合 "日:1,日:2,日:3,月:1,年:15,年:20,年:25"

意思是,我有随机的每个键的键和不同的值。我期待一个映射的输出,它具有唯一的键和对应的 int 值列表,如下所示:

{ 
"day": [1,2,3],
"Month": [1],
"year": [15,20,25]
}

请帮忙

【问题讨论】:

  • 想想你将如何手工解决这个问题。您有 3 个标记为“日”、“月”和“年”的存储桶。您将如何将输入分类到这些存储桶中?
  • 你试过什么?哪里出了问题,有具体的错误或问题?请edit您的问题包括minimal reproducible example

标签: java dictionary


【解决方案1】:
public static void main(String[] args){
    String input = "Day:1, Day:2, Day:3, Month:1, Year:15, Year:20, Year:25";
    List<String> list = Arrays.asList(input.split(","));
    
    JSONObject jsonObject = new JSONObject();
    
    for (String val : list) {
        String[] splitedValues = val.split(":");
        if(jsonObject.has(splitedValues[0].trim())) {
            jsonObject.getJSONArray(splitedValues[0].trim()).put(Integer.valueOf(splitedValues[1]));
        }else {
            List<Integer> integers = new ArrayList<Integer>(); 
            integers.add(Integer.valueOf(splitedValues[1]));
            jsonObject.put(splitedValues[0].trim(), integers);
        }
    }
    System.out.println(jsonObject);
}

输出

{"Month":[1],"Year":[15,20,25],"Day":[1,2,3]}

【讨论】:

    【解决方案2】:

    请在下面找到代码。我创建了一个内部类来映射类型和值,然后通过对类型进行分组来收集它。

    import java.util.Map;
    import java.util.stream.Collectors;
    
    import static java.util.stream.Collectors.groupingBy;
    import static java.util.stream.Collectors.toList;
    
    public class StringToMap {
        public static void main(String[] args) {
            String queryOutput = "Day:1, Day:2, Day:3, Month:1, Year:15, Year:20, Year:25";
            System.out.println(groupByTypeAndAddValuesToList(queryOutput));
        }
    
        private static Map<String, List<Integer>> groupByTypeAndAddValuesToList(String queryOutput) {
            final String[] split = queryOutput.split(",");
            return Arrays.stream(split).map(s -> {
                final String trimmed = s.trim();
                final String[] splitByColon = trimmed.split(":");
                return new TypeValues(splitByColon[0], Integer.parseInt(splitByColon[1]));
            }).collect(groupingBy(TypeValues::getType, Collectors.mapping(TypeValues::getValue, toList())));
        }
    
        private static class TypeValues {
            private final String type;
            private final Integer value;
    
            public TypeValues(String type, Integer value) {
                this.type = type;
                this.value = value;
            }
    
            public String getType() {
                return type;
            }
    
            public Integer getValue() {
                return value;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 2021-02-21
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多