여러 엔트리를 HashMap에 한 번에 추가, 1개의 스테이트먼트에서
상수 해시맵을 초기화해야 하는데 한 줄 문으로 초기화하려고 합니다.이렇게 피하는 것:
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]
이렇게 많은 것을 살펴봤지만 어떻게 해야 하는지 보여주는 예는 찾을 수 없었다.
Double Brace Initialization(더블 브레이스 초기화)을 다음과 같이 사용할 수 있습니다.
Map<String, Integer> hashMap = new HashMap<String, Integer>()
{{
put("One", 1);
put("Two", 2);
put("Three", 3);
}};
경고로서 퍼포먼스에 미치는 영향에 대해서는 "Efficiency of Java "Double Brace Initialization" 스레드를 참조하십시오.
Java 9 이후로는 다음과 같이 사용할 수 있습니다.
Map<String, Integer> immutableMap = Map.of("One", 1,
"Two", 2,
"Three", 3);
이 지도는 불변이다.맵을 변경할 수 있도록 하려면 다음 사항을 추가해야 합니다.
Map<String, Integer> hashMap = new HashMap<>(immutableMap);
Java 9를 사용할 수 없는 경우, 유사한 도우미 방법을 직접 작성하거나 서드파티 라이브러리(Guava 등)를 사용하여 기능을 추가해야 합니다.
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
다소 관련성이 있는 질문:맵의 해시맵에 대한 UnmutableMap.of() 회피책?
지도에는 Java 9에도 공장 메서드가 추가되어 있습니다.최대 10개의 엔트리에 대해 맵에 키와 값의 쌍을 가져오는 생성자가 오버로드되었습니다.예를 들어 다음과 같이 다양한 도시와 그 인구(2016년 10월 구글에 따르면)의 지도를 작성할 수 있다.
Map<String, Integer> cities = Map.of("Brussels", 1_139000, "Cardiff", 341_000);
Map의 var-args 케이스는 조금 어렵기 때문에 키와 값이 모두 필요하지만 Java에서는 메서드에 var-args 파라미터를 2개 사용할 수 없습니다.따라서 일반적인 케이스는 var-args 방식으로 처리됩니다.Map.Entry<K, V>
오브젝트 및 스태틱 추가entry()
방법을 찾아야 합니다.예를 들어 다음과 같습니다.
Map<String, Integer> cities = Map.ofEntries(
entry("Brussels", 1139000),
entry("Cardiff", 341000)
);
자바에는 지도 리터럴이 없기 때문에 당신이 요구하는 것을 정확하게 할 수 있는 좋은 방법은 없습니다.
이러한 유형의 구문이 필요한 경우 Java와 호환되며 다음 작업을 수행할 수 있는 Groovy를 고려해 보십시오.
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
(이것은 「도달할 수 없는 스테이트먼트」의 진단을 피하기 위해서 필요), 엄밀히 말하면, 1개의 스테이트먼트 뿐입니다.
유틸리티 클래스에 다음 유틸리티 함수를 추가할 수 있습니다.
public static <K, V> Map<K, V> mapOf(Object... keyValues) {
Map<K, V> map = new HashMap<>(keyValues.length / 2);
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를 사용할 수 있습니다.
@Dakusan(HashMap을 확장하기 위해 정의하는 클래스)에서 제시한 솔루션을 기반으로 다음과 같이 수행했습니다.
public static HashMap<String,String> SetHash(String...pairs) {
HashMap<String,String> rtn = new HashMap<String,String>(pairs.length/2);
for ( int n=0; n < pairs.length; n+=2 ) rtn.put(pairs[n], pairs[n + 1]);
return rtn;
}
..이렇게 사용하면:
HashMap<String,String> hm = SetHash( "one","aa", "two","bb", "tree","cc");
(그렇게 해서 단점이 있는지는 모르겠지만(Java 개발자가 아니라 java로 몇 가지 작업만 하면 됩니다), 동작도 좋고, 나에게도 쾌적하게 느껴집니다.
또 다른 접근법은 정규 표현에 의해 하나의 문자열에서 모든 요소 값을 추출하는 특수 함수를 작성하는 것입니다.
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;
}
}
언급URL : https://stackoverflow.com/questions/8261075/adding-multiple-entries-to-a-hashmap-at-once-in-one-statement
'programing' 카테고리의 다른 글
Vue.js에서 정적 데이터를 저장하고 소비하는 방법 (0) | 2022.07.30 |
---|---|
vuex 및 vue-resource를 사용하여 데이터 프리페치 (0) | 2022.07.28 |
Vue 및 부트스트랩:미디어 중단점에 따라 다른 컴포넌트를 표시하는 방법최신 컨센서스란? (0) | 2022.07.28 |
자바에서 가장 가까운 함수 포인터는 무엇입니까? (0) | 2022.07.28 |
Vue 구성 요소가 활성 상태인지 확인하는 방법 (0) | 2022.07.28 |