Используя потоки Java 8, как заменить ключ на карте с его индексом? - PullRequest
0 голосов
/ 12 мая 2018

Итак, у меня есть Map<String, Map<String, Integer>>, и я хочу преобразовать его в Map<Integer, Map<String, Integer>>, где ключ String заменяется его индексом на карте (0,1,2, .....). Я знаю, что индексы не точны на картах, но это не имеет значения в моем случае. Я пытался использовать AtomicInteger в качестве индекса, который увеличивается после каждой операции в потоке, но я не смог решить проблему ....

Ответы [ 4 ]

0 голосов
/ 12 мая 2018

Поскольку вам явно требуется Map<Integer, Map<String, Integer>>, вы можете сделать это в два этапа.

сначала соберите значения карты в список:

List<Map<String, Integer>> temporaryResult = new ArrayList<>(myMap.values());

затем создайте индекс вместе с картами:

Map<Integer, Map<String, Integer>> resultSet =
            IntStream.range(0, temporaryResult.size())
                    .mapToObj(i -> new AbstractMap.SimpleEntry<>(i,
                            temporaryResult.get(i)))
                    .collect(Collectors.toMap(AbstractMap.SimpleEntry::getKey,
                            AbstractMap.SimpleEntry::getValue));

или без сопоставления с промежуточным звеном AbstractMap.SimpleEntry '

Map<Integer, Map<String, Integer>> resultSet =
               IntStream.range(0, temporaryResult.size())
                        .boxed()
                        .collect(Collectors.toMap(Function.identity(),
                                temporaryResult::get));
0 голосов
/ 12 мая 2018

Вы можете использовать последовательность целых чисел и zip с ними, или сопоставить с этими целыми числами: IntStream.range(0, yourCollection.length)...

Это будет код, вам могут потребоваться незначительные корректировки. Вы можете получить представление о молнии. `

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.stream.IntStream;

class JavaTest{
    public int main(String[] args){
        Map<String, String> myMap = new HashMap<>();
        myMap.put("Key1", "Value1");
        myMap.put("Key2", "Value2");
        myMap.put("Key3", "Value3");

        List<String> values = new ArrayList<String>(myMap.values());

        Map<Integer, String> newMap = new HashMap<>();

        IntStream
        .range(0, values.size())
        .forEach(i -> newMap.put(i, values.get(i)));

        return 1;
    }
}

` Постскриптум Ваше мгновенное понижающее голосование действительно помогает мне отвечать на вопросы;)

0 голосов
/ 12 мая 2018

Как указывает Майкл a Map, где ключи только Integer, следующие друг за другом, могут быть уменьшены до List<Map<String, Integer>>, но если вы действительно используете свою конкретную структуру:

  1. вы можете использовать AtomicInteger:

    AtomicInteger a = new AtomicInteger(0);
    before.forEach((key, value) -> after.put(a.getAndIncrement(), value));
    

    => Рабочий пример здесь


Или, after пусто при запуске

before.values().forEach(value -> after.put(after.size(), value));

=> Рабочий пример здесь

0 голосов
/ 12 мая 2018

Карта с непрерывными целочисленными ключами концептуально не отличается от списка, так что на самом деле вам нужно получить List<Map<String, Integer>>.

Вы можете достичь этого следующим образом:

List<Map<String, Integer>> after = before.values().stream().collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...