Intereting Posts
Как сохранить вид макета как изображение или PDF на SD-карту в Android? SQLiteOpenHelper.getWriteableDatabase () Исключение null указателя на Android Эффект размытия, как в приложении Etsy? Android App Crashes Неожиданно во время работы? Создание анимации в ImageView при изменении ресурса изображения Как настроить SSL-сертификаты с помощью Charles Web Proxy и последнего эмулятора Android в Windows? Измените структуру файла проекта после перехода с Eclipse на структуру студий Android Studio Что означает информация / предупреждение MediaPlayer (973, 0)? Ошибка: атрибут «цвет» уже определен, обновить appcompat v-7 Анимация фрагментации: слайд и слайд Программная клавиатура Android 3.1 в полноэкранном режиме Как я могу решить, какой интервал использовать для requestLocationUpdates? Ошибка «Отсутствие экземпляра типа» при вызове метода из другого класса в Android ERROR / веб-консоль: ошибка с нечистотой: слишком много времени, затрачиваемого на обработчик выгрузки MonkeyRunner: простой способ определить координаты для команды MonkeyDevice touch?

Добавление нескольких записей в HashMap сразу в одном выражении

Мне нужно инициализировать константу HashMap и хотелось бы сделать это в одной строке. Избегайте этого:

hashMap.put("One", new Integer(1)); // adding value into HashMap hashMap.put("Two", new Integer(2)); hashMap.put("Three", new Integer(3)); 

Аналогично этому в объективе C:

 [NSDictionary dictionaryWithObjectsAndKeys: @"w",[NSNumber numberWithInt:1], @"K",[NSNumber numberWithInt:2], @"e",[NSNumber numberWithInt:4], @"z",[NSNumber numberWithInt:5], @"l",[NSNumber numberWithInt:6], nil] 

Я не нашел никакого примера, который показывает, как это сделать, посмотрев на так много.

Solutions Collecting From Web of "Добавление нескольких записей в HashMap сразу в одном выражении"

Вы можете сделать это:

 Map<String, Integer> hashMap = new HashMap<String, Integer>() {{ put("One", 1); put("Two", 2); put("Three", 3); }}; 

Вы можете использовать ImmutableMap от Google Guava. Это работает до тех пор, пока вы не заботитесь об изменении Карты позже (вы не можете вызвать .put () на карте после ее создания с помощью этого метода):

 import com.google.common.collect.ImmutableMap; // For up to five entries, use .of() Map<String, Integer> littleMap = ImmutableMap.of( "One", Integer.valueOf(1), "Two", Integer.valueOf(2), "Three", Integer.valueOf(3) ); // For more than five entries, use .builder() Map<String, Integer> bigMap = ImmutableMap.<String, Integer>builder() .put("One", Integer.valueOf(1)) .put("Two", Integer.valueOf(2)) .put("Three", Integer.valueOf(3)) .put("Four", Integer.valueOf(4)) .put("Five", Integer.valueOf(5)) .put("Six", Integer.valueOf(6)) .build(); 

См. Также: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.html

Несколько связанных вопросов: Обходной метод ImmutableMap.of () для HashMap в Картах?

В Java 9 можно будет использовать Map.of(...) , например:

 Map<String, Integer> immutableMap = Map.of("One", 1, "Two", 2, "Three", 3); 

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

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

До тех пор вы застряли в написании подобного вспомогательного метода самостоятельно или используя стороннюю библиотеку (например, Guava ), чтобы добавить эту функциональность для вас.

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

Если вам нужен этот тип синтаксиса, рассмотрите некоторые Groovy, которые совместимы с Java и позволяют:

 def map = [name:"Gromit", likes:"cheese", id:1234] 
  boolean x; for (x = false, map.put("One", new Integer(1)), map.put("Two", new Integer(2)), map.put("Three", new Integer(3)); x;); 

Игнорируя объявление x (что необходимо для предотвращения диагностики «недоступного оператора»), технически это всего лишь одно утверждение.

Вот простой класс, который выполнит то, что вы хотите

 import java.util.HashMap; public class QuickHash extends HashMap<String,String> { public QuickHash(String...KeyValuePairs) { super(KeyValuePairs.length/2); for(int i=0;i<KeyValuePairs.length;i+=2) put(KeyValuePairs[i], KeyValuePairs[i+1]); } } 

И затем использовать его

 Map<String, String> Foo=QuickHash( "a", "1", "b", "2" ); 

Это дает {a:1, b:2}

Вы можете добавить эту служебную функцию в класс утилиты:

 public static <K, V> Map<K, V> mapOf(Object... keyValues) { Map<K, V> map = new HashMap<>(); K key = null; for (int index = 0; index < keyValues.length; index++) { if (index % 2 == 0) { key = (K)keyValues[index]; } else { map.put(key, (V)keyValues[index]); } } return map; } Map<Integer, String> map1 = YourClass.mapOf(1, "value1", 2, "value2"); Map<String, String> map2 = YourClass.mapOf("key1", "value1", "key2", "value2"); 

Примечание: в Java 9 вы можете использовать Map.of

Другой подход может заключаться в написании специальной функции для извлечения всех значений элементов из одной строки регулярным выражением:

 import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Example { public static void main (String[] args){ HashMap<String,Integer> hashMapStringInteger = createHashMapStringIntegerInOneStat("'one' => '1', 'two' => '2' , 'three'=>'3' "); System.out.println(hashMapStringInteger); // {one=1, two=2, three=3} } private static HashMap<String, Integer> createHashMapStringIntegerInOneStat(String str) { HashMap<String, Integer> returnVar = new HashMap<String, Integer>(); String currentStr = str; Pattern pattern1 = Pattern.compile("^\\s*'([^']*)'\\s*=\\s*>\\s*'([^']*)'\\s*,?\\s*(.*)$"); // Parse all elements in the given string. boolean thereIsMore = true; while (thereIsMore){ Matcher matcher = pattern1.matcher(currentStr); if (matcher.find()) { returnVar.put(matcher.group(1),Integer.valueOf(matcher.group(2))); currentStr = matcher.group(3); } else{ thereIsMore = false; } } // Validate that all elements in the given string were parsed properly if (currentStr.length() > 0){ System.out.println("WARNING: Problematic string format. given String: " + str); } return returnVar; } }