在我的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);*/
}
谢谢!
似乎自然排序不适用于这个特定顺序的键: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
无论如何都需要键和值,因此填充字段的顺序应该不相关。