Мне нужно инициализировать константу 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]
Я не нашел ни одного примера, показывающего, как это сделать, просмотрев так много.
Вы можете использовать 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 в Картах?
источник
ImmutableMap
не принимаетnull
ключи или значения.Начиная с Java 9, можно использовать
Map.of(...)
, например, так:Map<String, Integer> immutableMap = Map.of("One", 1, "Two", 2, "Three", 3);
Эта карта неизменна. Если вы хотите, чтобы карта была изменяемой, вам нужно добавить:
Map<String, Integer> hashMap = new HashMap<>(immutableMap);
Если вы не можете использовать Java 9, вам придется написать аналогичный вспомогательный метод самостоятельно или использовать стороннюю библиотеку (например, Guava ), чтобы добавить эту функциональность за вас.
источник
Map.of
сделано только до 10 записей, так как это довольно трудоемкоКарты также имеют фабричные методы, добавленные в Java 9. До 10 записей Карты имеют перегруженные конструкторы, которые принимают пары ключей и значений. Например, мы могли бы построить карту различных городов и их населения (по данным Google на октябрь 2016 г.) следующим образом:
Map<String, Integer> cities = Map.of("Brussels", 1_139000, "Cardiff", 341_000);
Случай var-args для Map немного сложнее, вам нужны как ключи, так и значения, но в Java методы не могут иметь два параметра var-args. Таким образом, общий случай обрабатывается путем использования метода
Map.Entry<K, V>
объектов var-args и добавления статическогоentry()
метода, который их конструирует. Например:Map<String, Integer> cities = Map.ofEntries( entry("Brussels", 1139000), entry("Cardiff", 341000) );
Методы фабрики коллекций в Java 9
источник
В Java нет литерала карты, поэтому нет хорошего способа сделать именно то, что вы просите.
Если вам нужен такой синтаксис, подумайте о Groovy, который совместим с Java и позволяет вам:
def map = [name:"Gromit", likes:"cheese", id:1234]
источник
Вот простой класс, который выполнит то, что вы хотите
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}
источник
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
(что необходимо, чтобы избежать диагностики «недостижимый оператор»), технически это только один оператор.источник
Вы можете добавить эту служебную функцию в служебный класс:
public static <K, V> Map<K, V> mapOf(Object... keyValues) { Map<K, V> map = new HashMap<>(); for (int index = 0; index < keyValues.length / 2; index++) { map.put((K)keyValues[index * 2], (V)keyValues[index * 2 + 1]); } 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источник
Map<Integer, String>
, также предоставит эти типы ...Другой подход может заключаться в написании специальной функции для извлечения всех значений элементов из одной строки с помощью регулярного выражения:
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; } }
источник