【问题标题】:How to build an object from similar key value prefix in a map如何从地图中的相似键值前缀构建对象
【发布时间】:2016-10-13 10:32:58
【问题描述】:

首先我使用 Java 来编写这个。 所以我有一个像这样的键和值的地图。

 Key  = Value
"a.1" = "a1"
"a.2" = "a2"
"a.3" = "a3"
"b.1" = "b1"
"b.2" = "b2"
"b.3" = "b3"
"c.1" = "c1"
"c.2" = "c2"
"c.3" = "c3"

我需要做的是将它全部拆分并制作,以便最终我可以循环并使用

创建新对象
someloop{
    new someObject(a1,b1,c1); // new someObject(a2,b2,c2);  // new someObject(a3,b3,c3);
}

我需要能够使其动态化,以便添加另一个前缀 (d,e) 并检查数字是否丢失或被跳过。

【问题讨论】:

  • "同时也保持秩序。"哎呀。你知道“a.1”、“a.2”和“a.10”,如果你使用字符串(即字典顺序)?
  • 我想保持秩序并不是那么重要。
  • 如果不这样做,您打算如何检测漏洞?
  • 前缀是否总是一个美国 ASCII 字母(a 到 z)?每个前缀是否总是恰好三个键值对?还是SomeObject() 接受可变参数?
  • 你能解释一下分割部分吗?创建一个所有值都以相同数字结尾的对象?

标签: java list properties split maps


【解决方案1】:

如果您将 SomeObject 的构造函数更改为接受字符串列表,这可能会起作用:

 Map<String, String> map = new HashMap<>();
    map.put("a.1", "a1");
    map.put("a.2", "a2");
    map.put("a.3", "a3");
    map.put("b.1", "b1");
    map.put("b.2", "b2");
    map.put("b.3", "b3");
    map.put("c.1", "c1");
    map.put("c.2", "c2");
    map.put("c.3", "c3");

    Map<String, List<String>> grouped = map.entrySet().stream()
            .sorted(Comparator.comparing(Map.Entry::getKey))
            .collect(Collectors.groupingBy(
                    entry -> entry.getKey().split("\\.")[0],
                    HashMap::new,
                    Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

    List<SomeObject> objects = grouped.values().stream().map(SomeObject::new).collect(Collectors.toList());

    System.out.println(objects);

【讨论】:

  • 或者如果你的SomeObject() 构造函数只是可变参数,它仍然会接受一个数组:List&lt;SomeObject&gt; objects = grouped.values().stream().map(list -&gt; list.toArray(new String[list.size()])).map(SomeObject::new).collect(Collectors.toList());
【解决方案2】:

我省略了输入验证:

public static void buildObjects(Map<String, String> keyValuePairs) {
    List<List<String>> sortedValues = new ArrayList<>();
    // assuming keys are ending in a digit 1 through 9, add empty lists to sortedValues to hold values
    sortedValues.add(null); // index 0
    for (int index = 0; index <= 9; index++) {
        sortedValues.add(new ArrayList<>());
    }

    for (Map.Entry<String, String> pair : keyValuePairs.entrySet()) {
        String key = pair.getKey();
        int indexOfDot = key.indexOf('.');
        int suffix = Integer.parseInt(key.substring(indexOfDot + 1));
        sortedValues.get(suffix).add(pair.getValue());
    }
    for (List<String> list : sortedValues) {
        if (list != null && ! list.isEmpty()) {
            new SomeObject(list.toArray(new String[list.size()]));
        }
    }
}

您可能还想添加对创建的对象执行某些操作的代码。

如果您想确定传递给构造函数的值的顺序,您可以使用new TreeMap(keyValuePairs) 甚至new TreeMap(yourComparator).putAll(keyValuePairs)。这将控制键的处理顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    相关资源
    最近更新 更多