получить ключ и значение из HashMap в ArrayList - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть файл, который я получаю все данные и разделяю его в HashMap.Файл выглядит примерно так ниже:

До : - key, а после - value

key1: 1
key2: 2
key3: 3

- это код, который помещает данные файла вкарта ArrayList:

protected List<Map<String, String>> yaml_parse(BufferedReader filename) throws IOException{

    String result;
    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    while ((result = filename.readLine()) != null) {
        Map<String, String> map = new HashMap<String, String>();
        String key = result.substring(0, result.indexOf(":"));
        String value = result.substring(result.lastIndexOf(":") + 2);
        map.put(key, value);
        list.add(map);
    }

    return list;
}

в другом классе, где я вызываю функцию и println, это вывод

[{key1=1}, {key2=2}, {key3=3}]

Итак, мой главный вопрос: как мне получить key1и вернуть ли это значение?

Ответы [ 4 ]

0 голосов
/ 11 февраля 2019

Я не понимаю, почему вы создаете List карт.Map позволит вам добавить несколько пар ключ-значение.Вот способ, который будет работать:

protected Map<String, String> yaml_parse(BufferedReader filename) throws IOException{
    String result;
    Map<String, String> map = new HashMap<String, String>();
    while ((result = filename.readLine()) != null) {
        //keyValue[0] = key, keyValue[1] = value
        String[] keyValue = result.split(": "); 
        map.put(keyValue[0], keyValue[1]);
    }

    return map;
}

И вы будете использовать его так:

Map<String, String> map = yaml_parse("myFile.yaml");
String key1Value = map.get("key1"); //Stores key1's value into key1Value

Я думаю, что вы, возможно, используете неправильную структуру данных.От вашего вопроса, кажется, что вы хотите только Map, а не List из Maps.

0 голосов
/ 11 февраля 2019

Вы уверены, что вам нужна именно эта структура данных?

Карта может содержать более 1 пары ключ / значение.Почему бы не иметь здесь единственную хэш-карту, содержащую все 3 пары ключ / значение, и в этот момент вы можете просто сделать:

map.get("key1")

, и она все равно будет быстрой, даже если у вас их миллионы.

Если вы создаете карты одного размера и помещаете их в массив, потому что хотите сохранить порядок, используйте LinkedHashMap.Если вам нужно уметь работать с повторяющимися ключами, используйте гуаву Multimap или сделайте Map<String, List<String>>.

0 голосов
/ 11 февраля 2019

Вы должны взглянуть на изменение List<Map> на Map.Вы можете сделать это, используя:

Map<String, String> map = list.stream()
        .flatMap(m -> m.entrySet().stream())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Если вы хотите работать с текущей структурой данных, вы можете получить требуемое значение следующим образом:

private Optional<String> getValue(List<Map<String, String>> list, String key) {
    return list.stream()
            .filter(m -> m.containsKey(key))
            .map(m -> m.get(key))
            .findFirst();
}

и использовать его следующим образом:-

Optional<String> value = getValue(list, "key2");
System.out.println(value.orElse(null));
0 голосов
/ 11 февраля 2019

Так что, если вы заинтересованы в использовании java-8, если список карт содержит какие-либо записи с ключом, как key1 вернет первое значение записи, иначе вернет значение по умолчанию

list.stream().flatMap(map->map.entrySet().stream().filter(entry->entry.getKey().equals("key1"))).findFirst()
  .orElse(new AbstractMap.SimpleEntry("key1", "default value")).getValue();

Просто используя обычный цикл for

for(Map<String, String> map : list) {
        if(map.containsKey("key1")) {
            result = map.get("key1");
            break;
        }
    }
...