C#難民はJavaコレクションの助けを少し求めています
-
06-07-2019 - |
質問
キー/値の情報を何らかのタイプのコレクションに保存する必要があります。 C#では、次のような辞書を定義します。
var entries = new Dictionary<string, int>();
entries.Add("Stop me", 11);
entries.Add("Feed me", 12);
entries.Add("Walk me", 13);
次に、値にアクセスします:
int value = entries["Stop me"];
Javaでこれを行うにはどうすればよいですか? ArrayList
の例を見てきましたが、可能であればジェネリックを使用したソリューションが必要です。
解決
Map
Map<String, Integer> m = new HashMap<String, Integer>();
m.put("Stop me", 11);
Integer i = m.get("Stop me"); // i == 11
最後の行では、次のように言うことができました。
int i = m.get("Stop me");
(Javaの自動ボックス化解除を使用)の略記:
int i = m.get("Stop me").intValue()
指定されたキーのマップに値がない場合、get
はnull
を返し、この式はNullPointerException
をスローします。したがって、この場合、ボックス型 Integer
を使用することを常にお勧めします
他のヒント
java.util.Map
を使用します。いくつかの実装があります:
-
HashMap
:O(1)ルックアップ、キーの順序を維持しません -
TreeMap
:O(log n)ルックアップ、キーの順序を維持するため、保証された順序でキーを反復処理できます -
LinkedHashMap
:O(1)ルックアップ。キーがマップに追加された順にキーを反復処理します。
次のように使用します:
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Stop me", 11);
map.put("Feed me", 12);
int value = map.get("Stop me");
コレクションをさらに便利に使用するには、 Googleコレクションライブラリ。素晴らしいです。
Map
Javaで。
ジェネリック型パラメーターとしてint
(または他のプリミティブ型)を使用することはできませんが、オートボクシングのため、Map<String, int>
であるかのようにほぼ動作しますMap<String, Integer>
の代わりに。 (ただし、パフォーマンスに敏感なコードで多くのオートボクシングを行いたくありません。)
Map<String, Integer> entries = new HashMap<String, Integer>();
entries.put("Stop me", 11);
entries.put("Feed me", 12);
entries.put("Walk me", 13);
int value = entries.get("Stop me"); // if you know it exists
// If you're not sure whether the map contains a value, it's better to do:
Integer boxedValue = entries.get("Punch me");
if (boxedValue != null) {
int unboxedValue = boxedValue;
...
}
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("Stop Me", 11);
map.put("Feed Me", 12);
map.put("Walk Me", 13);
Integer x; // little hack
int value = (x = a.get("aaa")) == null? 0 : x;
代替として、Enumを試すことができます:
enum Action {
STOP(11),
FEED(12),
WALK(13);
private final int value;
private Action(int value) {
this.value = value;
}
public int value() {
return value;
}
public static Action valueOf(int value) {
for (Action action : values()) {
if (action.value == value) {
return action;
}
}
return null; // or a null-object
}
}
テスト:
public void action() {
Action action = Action.valueOf("FEED");
// or Action.FEED for more compile-time safety
int value = action.value();
// instantiating by code
Action walk = Action.valueOf(13);
}
間違いなくHashMap
が必要です。これはJavaバージョンのC#Dictionary
です。
所属していません StackOverflow