TreeMap 出现异常 "fromKey > toKey"(fromKey 大于 toKey?)

TreeMap getting exception "fromKey > toKey" (fromKey is greater than toKey?)

我已将以下 xml 属性存储到

HashMap<String, String> extraParams = new HashMap<String, String>()

<parameter name="sourceAttrStart" value="true" />
<parameter name="user" value="admin" />
<parameter name="password" value="password" />
<parameter name="SQL" value="SELECT * FROM test.users" />
<parameter name="driverClass" value="com.mysql.jdbc.Driver" />
<parameter name="url" value="jdbc:mysql://tesco-db.ce7gg2eo7hdc.us-
<parameter name="sourceAttrEnd" value="true" />

基本上我想获得 kets sourceAttrStartsourceAttrEnd

之间的 hashmap 的子集

这就是我正在尝试的

TreeMap<String, String> sorted = new TreeMap<String, String>(extraParams);

SortedMap<String, String> sourceParams = sorted.subMap("sourceAttrStart", "sourceAttrEnd");

但是低于异常,知道为什么吗?

java.lang.IllegalArgumentException: fromKey > toKey
    at java.util.TreeMap$NavigableSubMap.<init>(TreeMap.java:1368)
    at java.util.TreeMap$AscendingSubMap.<init>(TreeMap.java:1855)
    at java.util.TreeMap.subMap(TreeMap.java:913)
    at java.util.TreeMap.subMap(TreeMap.java:954)

TreeMap 按字典顺序对键进行排序。 字符串 "sourceAttrEnd" 按此顺序在 "sourceAttrStart" 之前。

TreeMap 使用键的自然顺序(compareTo() 方法)对元素进行排序。
"sourceAttrEnd" String"sourceAttrStart" String 之前 compareTo().
而当您调用 TreeMap.subMap("sourceAttrStart", "sourceAttrEnd") 时抛出的异常:

java.lang.IllegalArgumentException: fromKey > toKey

无论在 HashMap 中添加元素然后使用 HashMap 对象创建已排序的集合都不允许按照您的意愿对它们进行排序,因为 HashMap 不允许保证元素的顺序。
因此,作为替代方案,您可以在 LinkedHashMap 加载文件后立即添加元素,因为 LinkedHashMap 会根据元素的插入顺序维护元素的顺序。
但是 Properties class 并不是为了保持元素出现的顺序而设计的。为了允许你应该扩展 Properties.
这是一个有趣的 example

除了使用方式之外,.properties 文件也未设计为具有特定的元素顺序。
所以我认为更好的选择是使用 Property class 并从中获取您需要的条目。例如,您可以在 List 中定义条目键。

这是一个基本示例:

Properties props = ...; // load your file
List<String> keysToRetrieve = Arrays.asList("sourceAttrStart", "user", ..., "sourceAttrEnd");

Map<String, String> entriesToRetrieve = new HashMap<>();
for (String key : keysToRetrieve){
   entriesToRetrieve.put(key, props.getProperty(key)); 
}