1

我已将以下 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

这就是我正在尝试的

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)
4

2 回答 2

2

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

于 2018-04-03T09:42:33.213 回答
2

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

java.lang.IllegalArgumentException: fromKey > toKey

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

除了使用方式之外,.properties文件也没有设计为具有特定的元素顺序。
所以我认为更好的选择是使用Property该类并从中获取您需要的条目。例如,您可以定义条目键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)); 
}
于 2018-04-03T09:42:54.077 回答