【问题标题】:Sorting a entrySet<String, String> by keys按键排序 entrySet<String, String>
【发布时间】:2021-10-21 16:06:46
【问题描述】:

在我的 entrySet 中,我有下一个值:

name -> "someName"
nameSpace -> "someNameSpace"
version -> "someVersion"

我正在迭代这个 entrySet 并将其值添加到最终对象,我的问题是我需要按顺序添加值:

nameSpace -> "someNameSpace"
name -> "someName"
version -> "someVersion"

首先使用名称空间。不太确定是否可以使用流或更复杂的东西来实现这一点。我正在手动执行此过程。

public static void main(String [] args){
     SortedMap<String, String> coordinates = new TreeMap<>();
    coordinates.put("name", "nameValue");
    coordinates.put("nameSpace", "nameSpaceValue");
    coordinates.put("version", "versionValue");
    String name = coordinates.get("name");
    String nameSpace = coordinates.get("nameSpace");
    String version = coordinates.get("version");

    /*Object.add("name", name);
    Object.add("nameSpace", nameSpace);
    Object.add("version", version);*/
}

谢谢!

【问题讨论】:

  • 遍历地图,将它们中的每一个添加到列表中,然后根据需要对列表进行排序。

标签: java sorting entryset


【解决方案1】:

似乎自然排序不适用于此特定顺序的键:nameSpace, name, version,因此SortedMap / TreeMap 需要一些非常自定义/硬编码比较器:

SortedMap<String, String> coordinates = new TreeMap<>(
    (a, b) -> b.startsWith(a) && !a.startsWith(b) ? 1 : a.compareTo(b)
);
coordinates.put("version", "versionValue");
coordinates.put("nameSpace", "nameSpaceValue");
coordinates.put("name", "nameValue");

// iterating the map
// coordinates.forEach((k, v) -> Object.add(k, v));
coordinates.forEach((k, v) -> System.out.println(k + " -> " + v));

输出:

nameSpace -> nameSpaceValue
name -> nameValue
version -> versionValue

另一种方法是使用LinkedHashMap 能够维护插入顺序并根据需要修复此顺序:

Map<String, String> coordinates = new LinkedHashMap<>();
// add entries in expected order
coordinates.put("nameSpace", "nameSpaceValue");
coordinates.put("name", "nameValue");
coordinates.put("version", "versionValue");

类似的方法是使用未排序的映射和按所需顺序排列的键列表。

Map<String, String> coordinates = new HashMap<>();    
coordinates.put("name", "nameValue");
coordinates.put("nameSpace", "nameSpaceValue");
coordinates.put("version", "versionValue");

List<String> keyOrder = Arrays.asList("nameSpace", "name", "version");
keyOrder.forEach(k -> System.out.println(k + " -> " + coordinates.get(k)));

但是,自定义对象的方法add 似乎无论如何都需要键和值,因此填充字段的顺序应该不相关。

【讨论】:

    猜你喜欢
    • 2018-01-10
    • 2015-11-02
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多