0

在我的 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);*/
}

谢谢!

4

1 回答 1

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无论如何都需要键和值,因此填充字段的顺序应该不相关。

于 2021-10-21T17:15:34.840 回答