Java итерации по карте с SimpleEntry - PullRequest
0 голосов
/ 31 марта 2019

У меня есть TreeMap с 3 записями следующего типа:

Map<String, Entry<String, String>> treeMap = new TreeMap<String, Entry<String, String>>();

Я заполняю карту следующим кодом:

SimpleEntry<String, String> simpleEntry = new SimpleEntry<String, String>("", "");

for (int i = 0; i < listSites.size(); i++) {

        String stringkey = listSites.get(i);
        String stringValue = listSitesDesc.get(i);
        String stringLink = listSitesLinks.get(i);

        entry = new SimpleEntry<String, String>(stringValue, stringLink);
        actionMap.put(stringkey, simpleEntry);

}

Это работает так, как ожидалось.

Моя проблема заключается в том, как извлечь отдельные значения из отсортированного TreeMap.

РЕДАКТИРОВАНИЕ:

for (Map.Entry<String, Entry<String, String>> entrySet : treeMap.entrySet()) {

        String key = entrySet.getKey();
        String valueKey = simpleEntry.getKey();
        String valueValue = simpleEntry.getValue();
}

Это печатает правильные значения для ключа, например:

 key = one , two , three , four , five ..... 

Но я получаю неправильные значения для valueKey и valueValue, например:

valueKey = bear , bear , bear , bear , bear ...

вместо:

valueKey = dog , cat , monkey, tiger , bear ....

Что я делаю неправильно?

Ответы [ 3 ]

4 голосов
/ 31 марта 2019

Map.keySet() (неудивительно) возвращает ключи , а не значения .

Чтобы получить значения , используйте (снова,неудивительно) Map.values().

Итерировать по всем парам ключ / значение, т.е. записи :

for (Map.Entry<String, Entry<String, String>> entry : treeMap.entrySet()) {
    // showing how to get at the parts:
    String key = entry.getKey();
    String valueKey = entry.getValue().getKey();
    String valueValue = entry.getValue().getValue();

}

Это необычный способподходите к любой проблеме, которую вы пытаетесь решить, потому что у каждого ключа есть только одно значение, поэтому у вас есть «ключ -> ключ -> значение», которое совпадает с просто «ключ -> значение».Подумайте об отказе от карты внешнего слоя и использовании только Map<String, String> и / или использовании классов с (именованными) полями для хранения ваших данных.

0 голосов
/ 31 марта 2019

Я не понимаю ваш вопрос ...

Но как мне получить второе и третье значения карты, определенные SimpleEntry?

Поскольку не совсем ясно, что именно вы ищете (возможно, именно поэтому вы не смогли найти ответ), вот несколько (но не все) способов перебора карты:

// I'm changing your map a little to avoid confusion over the word 'Entry'.
Map<String, SimpleEntry<String, String>> treeMap = new TreeMap<>();
for (Map.Entry<String, SimpleEntry<String, String>> ent: treeMap.entrySet())
{
  String key = ent.getKey();
  SimpleEntry val - ent.getValue();
}

Если вы используете Java 8 или новее ...

// Using your original map
Map<String, Entry<String, String>> treeMap = new TreeMap<>();
treeMap.forEach((key, value) ->
{
  // key is a String, value is an Entry<String, String>>
});

// Explicit parameter types can increase code readability
treeMap.forEach((String key, Entry<String, String>> value) ->
{
  // Have fun with the contents of your map!
});

0 голосов
/ 31 марта 2019

Во-первых, примите ответ @ Bohemian, вот что делает то, что вы хотите.и любые будущие гугл.Это не работает, потому что у вас есть ошибка: D (именно поэтому мы все приходим к переполнению стека, в зависимости от вашего определения ошибки)

SimpleEntry simpleEntry = new SimpleEntry ("", "");

...

actionMap.put (stringkey, simpleEntry entry );

это помогает?

...