TreeMap получает исключение "fromKey > toKey" (fromKey больше, чем 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" />

В основном я хочу получить подмножество hashmap между кетами 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)

2 ответа

Решение

TreeMap использует естественный порядок (compareTo() метод) ключей для заказа элементов.
"sourceAttrEnd"String до "sourceAttrStart"String с точки зрения compareTo(),
В то время как выброшенное исключение при вызове TreeMap.subMap("sourceAttrStart", "sourceAttrEnd"):

java.lang.IllegalArgumentException: fromKey> toKey

Независимо от добавления элементов в HashMap а затем с помощью HashMap Объект для создания отсортированной коллекции не позволит сделать их упорядоченными по вашему желанию, так как HashMap не гарантирует порядок элементов.
В качестве альтернативы, вы можете добавить элементы в LinkedHashMap как только загрузка файла как 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)); 
}

TreeMap сортировать ключи в лексикографическом порядке. строка "sourceAttrEnd" раньше "sourceAttrStart" в таком порядке.

Другие вопросы по тегам