2013-02-19 4 views
3

Я чувствую, что это очень простой вопрос, но я не мог найти ответа.Ввод массивов в хэш-карту

Можете ли вы ввести объект массива методу put из HashMap?

Пример:

Скажем, у вас есть HashMap:
HashMap<Integer, String> map = new HashMap <Integer, String>();

У вас есть массив целых чисел и массив строк удобно дали. Массивы не инициализируются, как показано ниже, но содержат неизвестные значения (это просто проще для иллюстрации результата).

int[] keys = {1, 3, 5, 7, 9}; 
String[] values = {"turtles", "are", "better", "than", "llamas"}; 

Я хочу ключ-значение пары в HashMap быть:

1, turtles 
3, are 
5, better 
7, than 
9, llamas 

Может ли это быть достигнуто что-то вроде map.put(keys, values)? Я знаю, что это не работает, вы должны получить ошибку, например: «Метод put (Integer, String) в типе HashMap не применим для аргументов (int [], String [])». Я просто хочу что-то более эффективное, элегантный, или компактный, чем:

for (int i=0; i < keys.length; i++) { 
    map.put(keys[i],values[i]); 
} 

ответ

3

Я не могу себе представить, что

for (int i=0; i < keys.length; i++) { 
    map.put(keys[i],values[i]); 
} 

можно было бы сделать гораздо более эффективной. Если это то, что вы собираетесь делать часто, я бы, возможно, написал вспомогательный объект около Map.

Обратите внимание, что Map.putAll() существует, если значения, которые вы хотите добавить, - уже на карте.

+0

Я так много думал. Я знал о Map.putAll(), к сожалению, мои значения не находятся на карте. Именно поэтому я надеялся, что putAll() будет существовать для массивов. Спасибо хоть. – Matt

0

Если вам нужно это поведение, вам необходимо проанализировать каждый элемент, чтобы поместить его в HashMap. В худшем случае будет O (n), и вы не можете уменьшить это. Вы должны коснуться всех элементов для заполнения HashMap
Ниже кода (Как уже упоминалось Вами) является единственным обходным

for (int i=0; i < keys.length; i++) { 
    map.put(keys[i],values[i]); 
} 
0

На мой взгляд, вы уже открыли для себя довольно прямо вперед подход к этой проблеме.

HashMap<Integer, String> map = new HashMap <Integer, String>(); 
int[] keys = {1, 3, 5, 7, 9}; 
String[] values = {"turtles", "are", "better", "than", "llamas"}; 

for(int i = 0; i < keys.length; i++){ 
    map.put(keys[i], values[i]); 
} 
0

Нет другого способа напрямую помещать массивы в карту. Вам нужно выполнить итерацию по каждому элементу массива и вставить пару ключ-значение в карту.

0

Существует не кроме старого старого for, но вы всегда можете реализовать свое собственное решение.Для действительно многословным подхода:

public class MapFromArrayBuilder { 
    private MapFromArrayBuilder() {} 

    public static <K, V> Binder<K, V> map(K[] keys, V[] values) { 
     return new Binder(keys, values); 
    } 

    public static class Binder<K, V> { 
     private final V[] values; 
     private final K[] keys; 

     public Binder(K[] keys, V[] values) { this.keys = keys; this.values = values; } 

     public void into(Map<K, V> map) { 
      for (int i = 0; i < keys.length; i++) { 
       map.put(keys[i], values[i]); 
      } 
     } 
    }  

с ним вы могли бы сделать что-то вроде

public static void main(String[] args) { 
    Map<Integer, String> leMap = new LinkedHashMap<Integer, String>(); 

    map(new Integer[] {0}, new String[] {"teste"}).into(leMap); 

    for (Integer key : leMap.keySet()) { 
     System.out.format("%d = %s\n", key, leMap.get(key)); 
    } 
} 

Но это создает объекты только для удобочитаемости: P Не самый performatic решения, но это здорово, чтобы прочитать это:

В любом случае, предпочитайте старые добрые for. Мне нравится создавать подобные конструкции только для удовольствия, это не предназначено для использования в производственном коде, поскольку он делает много циклов, чтобы избежать небольшого императивного кода :)

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