排序的maplike数据结构,允许重复并可以存储到文件

时间:2016-11-02 07:02:51

标签: java json sorting

作为一个例子,我有一张地图,比方说,星期几和下雨量。看起来像:

1 -> 5"
2 -> 12"
3 -> 0"
4 -> 0"
5 -> 5"
6 -> 7"
7 -> 12"

我想以有条理的方式组织这个:

0" -> 3
0" -> 4
5" -> 1
5" -> 5
7" -> 6
12" -> 2
12" -> 7

此外,想要将其存储到JSON文件中,并让另一个程序读回此JSON。这两个程序可能没有共享类。因此,不是在每一方都编写自定义代码,如果可能的话,我想尝试使用Java中的标准类来解决这个问题。

这可能吗?

我能想到的最好的解决方案是编写2个数组,第一个用“rain”,第二个用作工作日的索引。因此看起来像:

{
 "inchRain": [
  0, 0, 5, 5, 7, 12, 12
 ],
 "arrIndex": [
  3, 4, 1, 5, 6, 2, 7
 ]
}

任何人都能想到的其他想法? 谢谢,

2 个答案:

答案 0 :(得分:0)

您可以使用Java8流轻松转换地图。在您的情况下,您可以将其转换为二维数组,然后将其序列化为Json。在接收端,您可以执行反向转换。您可以使用任何您想要的JSON库

        // sending end
        Map<Integer, Integer> data = new TreeMap<>();
        data.put(1, 5);
        data.put(2, 12);
        data.put(3, 0);
        data.put(4, 0);
        data.put(5, 5);
        data.put(6, 7);
        data.put(7, 12);

        Integer[][] toSend = data.entrySet().stream()
                .map(e -> new Integer[] { e.getValue(), e.getKey() })
                .sorted((e0, e1) -> e0[0].compareTo(e1[1]))
                .toArray(Integer[][]::new);

        String fileContent = new Gson().toJson(toSend);

        // receiving end
        Integer[][] received = new Gson().fromJson(fileContent, Integer[][].class);
        Map<Integer, Integer> dataRead = Arrays.stream(received).collect(Collectors.toMap(e -> e[1], e -> e[0]));

        assertEquals(data, dataRead);

答案 1 :(得分:0)

我认为您希望在值而不是键上对地图进行排序。 下面的链接将帮助您制作比较器,根据地图的值对地图进行排序。 http://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java

现在,一旦准备好地图,就可以轻松地在单独的数组中获取键和值。