У меня есть строки List
, которые на самом деле являются ключами и значениями: "key1", "value1", "key2", "value2", ...
(каждый нечетный элемент - это ключ, каждый четный - значение). Как я могу преобразовать его в Map
вот так "key1" -> "value1", "key2" -> "value2", ...
красивым способом?Преобразование Java Перечень строк ключа/значения на карту
ответ
Я не уверен, что есть «красивый» способ, но это самый простой способ:
while (!list.isEmpty()) {
map.put(list.remove() ,list.remove());
}
Если ваш список имеет случайный доступ, как к ArrayList
, то прямой способ заключается в перебрать элементы в списке с шагом 2:
public static void main(String[] args) {
List<String> list = Arrays.asList("key1", "value1", "key2", "value2");
Map<String, String> map = new HashMap<>();
for (int i = 0; i < list.size() - 1; i += 2) {
map.put(list.get(i), list.get(i + 1));
}
System.out.println(map);
}
Обратите внимание, что это также обрабатывает правильно случай, когда список не имеет четное длину. Он игнорирует последний элемент. Например, если в списке "key1", "value1", "key2"
, результатом будет карта {key1=value1}
.
Мне было интересно, как вы думаете, можно ли использовать потоки Java8? –
@ YassinHajaj sprinter ответил одним из них: http://stackoverflow.com/a/36087498/1743880 – Tunaki
Вот относительно аккуратный способ в Java 8:
Map<String, String> map = IntStream.range(0, list.size()/2)
.boxed()
.collect(Collectors.toMap
(i -> list.get(i * 2),
i -> list.get(i * 2 + 1)));
Почему у этого нет больше болей? :) –
Вы можете просто сделать:
Iterator<String> it = list.iterator();
while(it.hasNext()) {
map.put(it.next(), it.next());
}
Это будет более эффективным, чем при использовании метода get(index)
(в случае, если реализация списка не разрешить произвольный доступ)
Мне это нравится, спасибо! – coquin
Это генерирует исключение, если в списке есть «key1», «value1», «key2» ', т. Е. Равномерная длина. – Tunaki
@ Тунаки. Да, наличие списка хорошо сформировано является обязательным условием. Проверки можно легко добавить, но на самом деле это не точка ответа. Я не думаю, что он заслуживает нисходящего движения, хотя ... –
С Eclipse Collections должно быть выполнено:
MutableList<String> list =
Lists.mutable.of("key1", "value1", "key2", "value2", "key3", "value3");
Map<String, String> map =
list.asLazy().chunk(2).toMap(Iterate::getFirst, Iterate::getLast);
Verify.assertMapsEqual(
Maps.mutable.of("key1", "value1", "key2", "value2", "key3", "value3"), map);
MutableList - это интерфейс списка коллекций Eclipse. Если у вас есть список JDK, должно работать:
List<String> list =
Arrays.asList("key1", "value1", "key2", "value2", "key3", "value3");
Map<String, String> map =
ListAdapter.adapt(list).asLazy().chunk(2).toMap(Iterate::getFirst, Iterate::getLast);
Verify.assertMapsEqual(
Maps.mutable.of("key1", "value1", "key2", "value2", "key3", "value3"), map);
выше использует chunk
, который генерирует промежуточные списки. Код преуспеет в списке с нечетным количеством элементов, но в результате карта будет иметь одну запись, в которой ключ и значение будут одинаковыми. Этот код работает как с списками произвольного доступа, так и с неслучайным доступом.
Этот код может быть более эффективным для списков произвольного доступа.
MutableList<String> list =
Lists.mutable.of("key1", "value1", "key2", "value2", "key3", "value3");
MutableMap<String, String> map = Maps.mutable.empty();
IntInterval.oneToBy(list.size(), 2).each(i -> map.put(list.get(i - 1), list.get(i)));
Verify.assertMapsEqual(
Maps.mutable.of("key1", "value1", "key2", "value2", "key3", "value3"), map);
Примечание: Я являюсь автором коллекций Eclipse.
- 1. Преобразование Java XML в карту
- 2. Преобразование Multiset на карту
- 3. Перечень файлов на Java. Свежий взгляд
- 4. Преобразование одноуровневого списка на карту
- 5. Перечень строк, вопрос с запросом Array issue
- 6. Возврат Перечень объектов вместо Перечень объектов
- 7. Преобразование строк на дату в Java исключение
- 8. Преобразование JRuby RubyHash в Java-карту?
- 9. Преобразование XML в карту в java
- 10. Сравнение строк и преобразование строк в Java
- 11. Преобразование строки в карту?
- 12. Перечень списков?
- 13. события изменения на вычислительном Перечень
- 14. Перечень сертификатов, доступных только на смарт-карте
- 15. Преобразование карты Java в неизменяемую карту Scala в Java-коде
- 16. Перечень характеристик
- 17. Hibernate Перечень Mapping
- 18. Преобразование набора параметризованных типов на карту
- 19. Преобразование памяти EFI Карта на карту E820
- 20. Какое правильное преобразование из JSON на карту?
- 21. Как создать карту на Java?
- 22. Несколько строк текста на одну карту
- 23. Добавление строк JSON прозрачно на карту/список
- 24. Преобразование локон запрос на Java
- 25. Преобразование простой XML-строку в карту элегантно
- 26. Преобразование HEALPix в кубическую карту
- 27. Java: преобразование массива строк в байты
- 28. Преобразование Java ArrayList строк в массив JavaScript
- 29. Elixir - Преобразование Список в карту
- 30. Clojure, преобразование коллекции в карту
Я думаю, что вам нужно: .remove (0), я также проверил бы, если list.size()% 2 == 0 – agilob
Это опасно, потому что он мутирует список, который может вызвать исключение. – Tunaki