2014-02-11 2 views
0

java.util.Map поставляется с entrySet() метод, который ...Построение карты из набора <Map.Entry> в Java 7?

Возвращает представление набора отображений содержится в этой карте.

Есть один вызов метода или серию API вызовов реконструировать набор из набора с помощью Java 7 API, как отмечено то, что мне нужно сделать, чтобы положить здесь? в следующем примере кода?

package so; 

import java.util.HashMap; 
import java.util.Map; 
import java.util.Set; 

public class SetMapExample { 
    public static void main(String[] args) { 
     Map<String, String> m = new HashMap<String, String>(); 
     m.put("k1", "v1"); 
     m.put("k2", "v2"); 
     Set<Map.Entry<String, String>> s = m.entrySet(); 
     Map<String, String> ms = s... // what do I need to put here? 
    } 
} 

Я не хочу использовать for цикл, если это возможно, и ожидать, подобный метод к entrySet на Map, но я не могу найти.

+0

'for (Map.Entry entry: s) {ms.put (entry.getKey(), entry.getValue()); } '... –

+2

@LuiggiMendoza, пожалуйста, не предлагайте ответы в качестве комментариев. – diazazar

+0

Примечание: 'Set' использует карту за кулисами, а значения * в' Set' фактически являются ключами в 'Map'. Таким образом, невозможно выполнить то, что вы хотите/нуждаетесь, без цикла 'for'. –

ответ

2

Apache Commons Коллекция предоставляет MapUtils.putAll, которые могут делать то, что вы хотите, но под одеялом, что просто делает логику в for петли, которую вы хотите избежать, так что вы можете также просто зацикленную себя ...

В общем случае нет способа построить Map из записей Set, которые не потребуют от вас (или функции библиотеки, которую вы вызываете) для повторного итерации записей по крайней мере один раз - могут быть особые случаи, например если у вас есть список записей, которые, как вам известно, сортируются по ключу, тогда вы можете написать реализацию карты только для чтения, поверх которой используется бинарный поиск, чтобы найти ключ.

+2

Это один странный метод. Он выполняет две разные вещи, в зависимости от того, какие интерфейсы реализует первый элемент переданного объекта Object []. Это похоже на функцию, которую я найду в коде Javascript или на каком-то другом динамически типизированном языке. Но это то, что нужно найти метод библиотеки, который близок к тому, что хочет OP. –

+0

@MarkPeters это немного странный, в библиотеке Java я ожидал перегрузки для «Map.Entry []», «Object [] []» и т. Д. Вместо динамической типизации времени исполнения. –

0

JDK не предоставляет такой метод, однако вы можете использовать Guava, если хотите. Совет: используйте Transofrmers или Maps. Вы должны написать свой собственный «трансформатор» - однострочную реализацию Guava Function. Если вы реализуете его как общий класс верхнего уровня, вы можете повторно использовать его позже.

+0

Какой метод преобразования вы предлагаете использовать? Преобразование между типами данных не является тем, что делают методы преобразования Guava, они преобразуют * записи * структуры данных при сохранении одного и того же типа данных. Поэтому, чтобы использовать Guava здесь, вам нужно указать, какой метод будет конвертировать между «Set >» и «Карта » –

+0

-1. В Гуаве нет ничего, что могло бы помочь здесь. –

1

Set использует Map за кулисы и значения в Set фактически являются ключами в Map. Таким образом, невозможно выполнить то, что вы хотите/нуждаетесь, без цикла for. Использование простого Java (никакой другой фантазий Каркасы), вы только можете сделать это:

for(Map.Entry<String,String> entry : s) { 
    ms.put(entry.getKey(), entry.getValue()); 
} 
+0

Как насчет случая, когда у меня был 'Set >' как будто он был передан мне? Я только предложил образец «основной» в вопросе в качестве руководства в случае, если я не знаю о своих намерениях. –

+0

@JacekLaskowski Я не понимаю ваш вопрос, но мой ответ по-прежнему говорит, что вы не можете сделать это, не используя цикл 'for'. –

+0

Я просто сказал, что в моем случае мне дали «Набор», и хотя он поддерживается «Картой», у меня нет доступа к нему. Спасибо за Ваш ответ. –

0

java.util.Map#entrySet() является операцией один ракурса относительно добавления элементов и конструктор, принимающего Set<Map.Entry<K, V>> кажется очень специфический и редко случается случай.

Смежные вопросы