1つのステートメントでHashMapに複数のエントリを同時に追加する

私は定数HashMapを初期化する必要があり、1行のステートメントでそれをしたいと思います。このようなsthを避ける:

  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] 

私はこのように多くの人を見ていることを示す方法を示す例は見つけていません。

94

9 答え

あなたはこれを行うことができます:

Map hashMap = new HashMap()
{{
     put("One", 1);
     put("Two", 2);
     put("Three", 3);
}};
180
追加された
@TimoTürschmannこのようなマップを静的に初期化する必要がある場合は、静的になり、使用するたびにパフォーマンスペナルティがなくなります。変数が静的でなくこのような初期化(はループ内でこれを使用するなど)を必要とすることは他にはありません。私は間違っているかもしれませんが、プログラマーは発明的です。
追加された 著者 Chris Cirefice,
私がこれを控えめにした理由は、これがあなたがそれを使うたびに新しいクラスを作ることを説明しなかったからです。私は人々がこのようにすることのトレードオフを知っているべきだと思います。
追加された 著者 idungotnosn,
私はちょうど私のコードに入れて、私はこの警告/メッセージの行に: "serializableクラスは、long型の静的なfinalVersionUIDフィールドを宣言していません"。私はそれを無視することはできますか?これは何を意味するのでしょうか?ありがとう
追加された 著者 user387184,
ありがとう - 私はそれを通常の方法と比較しようとします...
追加された 著者 user387184,
それは面白いようです。その名前はありますか?それは、Excelでの行列演算のように見えます...
追加された 著者 user387184,
@ user387184ええ、彼らはそれを "二重ブレース初期化子"と呼びます。このトピックを参照してください: stackoverflow.com/questions/ 924285 /…
追加された 著者 Eng.Fouad,
@ user387184あなたは無視することができます。このトピックを参照してください: 追加された 著者 Eng.Fouad,
このパターンを使用しないでください。危険な状態があり、合理的な選択肢があります。
追加された 著者 dimo414,
このメソッドは使用しないでください。使用するたびに新しいクラスが作成されます。マップを作成するだけではパフォーマンスが大幅に悪くなります。 stackoverflow.com/questions/924285/&hellipを参照してください。 ;
追加された 著者 Timo Türschmann,
@TimoTürschmann:なぜあなたはコンパイルされた言語を使用していますか?
追加された 著者 HoldOffHunger,

Google GuavaのImmutableMapを使用できます。このメソッドを使用してマップを構築した後は、マップ上で.put()を呼び出すことはできません)。

import com.google.common.collect.ImmutableMap;

// For up to five entries, use .of()
Map littleMap = ImmutableMap.of(
    "One", Integer.valueOf(1),
    "Two", Integer.valueOf(2),
    "Three", Integer.valueOf(3)
);

// For more than five entries, use .builder()
Map bigMap = ImmutableMap.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();

See also: http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableMap.html

A somewhat related question: ImmutableMap.of() workaround for HashMap in Maps?

46
追加された
Guavaは巨大で、絶対に必要な場合を除き、Androidアプリには使用しません
追加された 著者 ericn,
@ericn ProGuard では、使用していないライブラリの一部を除外することができます。
追加された 著者 dimo414,
ImmutableMap null のキーや値を受け入れないことに注意してください。
追加された 著者 Vadzim,

Java 9では、を使用することができます。 Map.of(...) のように:

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

このマップは不変です。マップを変更可能にするには、次のものを追加する必要があります。

Map hashMap = new HashMap<>(immutableMap);

Java 9を使用できない場合は、自分で同様のヘルパーメソッドを作成するか、サードパーティのライブラリ( Guava をご覧ください。

22
追加された

Javaにはマップリテラルがありませんので、あなたが求めているものを正確に行うための良い方法はありません。

そのような構文が必要な場合は、Javaと互換性のあるGroovyをいくつか検討してください。

def map = [name:"Gromit", likes:"cheese", id:1234]
8
追加された
    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つのステートメントだけです。

5
追加された
@MicahStairs - しかしそれは唯一のステートメントです。
追加された 著者 Hot Licks,
@MicahStairs - 私は悪化を見た。
追加された 著者 Hot Licks,
私は今日このコードをどのように検索しましたか?私はテストのためのコードに追加したが、私はそれが内部的にどのように動作するかを理解することはできません... :)
追加された 著者 GOXR3PLUS,
これは嫌なことにハッキーです。
追加された 著者 Micah Stairs,
確かですが、これは私が生産で遭遇することは決してありませんコードの種類です。
追加された 著者 Micah Stairs,

ここでは、あなたが望むものを達成するための簡単なクラスがあります

import java.util.HashMap;

public class QuickHash extends HashMap {
    public QuickHash(String...KeyValuePairs) {
        super(KeyValuePairs.length/2);
        for(int i=0;i

そして、それを使用する

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

This yields {a:1, b:2}

3
追加された

マップには、Java 9にファクトリメソッドが追加されています。最大10個のエントリに対して、マップはキーと値のペアをとるコンストラクタをオーバーロードしています。たとえば、さまざまな都市とその人口(2016年10月のGoogleによる)の地図を次のように作成できます。

Map cities = Map.of("Brussels", 1_139000, "Cardiff", 341_000);

The var-args case for Map is a little bit harder, you need to have both keys and values, but in Java, methods can’t have two var-args parameters. So the general case is handled by taking a var-args method of Map.Entry objects and adding a static entry() method that constructs them. For example:

Map cities = Map.ofEntries(
    entry("Brussels", 1139000), 
    entry("Cardiff", 341000)
);

Collection Factory Methods in Java 9

2
追加された

このユーティリティ関数をユーティリティクラスに追加することができます:

public static  Map mapOf(Object... keyValues) {
    Map 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 map1 = YourClass.mapOf(1, "value1", 2, "value2");
Map map2 = YourClass.mapOf("key1", "value1", "key2", "value2");

Note: in Java 9 you can use Map.of

1
追加された

もう1つのアプローチは、正規表現で1つの文字列からすべての要素値を抽出する特殊関数を書くことです。

import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {
    public static void main (String[] args){
        HashMap hashMapStringInteger = createHashMapStringIntegerInOneStat("'one' => '1', 'two' => '2' , 'three'=>'3'  ");

        System.out.println(hashMapStringInteger);//{one=1, two=2, three=3}
    }

    private static HashMap createHashMapStringIntegerInOneStat(String str) {
        HashMap returnVar = new HashMap();

        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;
    }
}
0
追加された