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 sourceAttrStart
到 sourceAttrEnd
之间的 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));
}
我已将以下 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 sourceAttrStart
到 sourceAttrEnd
这就是我正在尝试的
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));
}