web-dev-qa-db-ja.com

HashMapを正しく使用する方法は?

HashMap savedStuff = new HashMap();
savedStuff.put("symbol", this.symbol); //this is a string
savedStuff.put("index", this.index); //this is an int

私に警告を与えます:

HashMap is a raw type. References to generic type HashMap<K,V> should be parameterized  
12
Sheehan Alam

何をしようとしているのかわかりませんが、提供した例ではハードコードされた文字列を使用してデータにインデックスを付けているため、グループ化するデータはわかっているようです。その場合、マップはおそらく良い選択ではありません。より良いアプローチは、一般的にグループ化されたデータからクラスを作成することです。

public class SavedStuff {
  private int index;
  private String symbol;

  public SavedStuff(int index, String symbol) {
    this.index = index;
    this.symbol = symbol;
  }

  public int getIndex() {
    return index;
  }

  public String getSymbol() {
    return symbol;
  }
}

これにより、クライアントコードで次のことが可能になります。

SavedStuff savedStuff = ...
String symbol = savedStuff.getSymbol();

これではなく:

Map<String, Object> savedStuff = ...
String symbol = savedStuff.get("symbol");

前者の例は、文字列定数を使用してデータにインデックスを付けていないため、脆弱性がはるかに低くなっています。また、グループ化されたデータの上に動作を追加する場所を提供します。これにより、コードがはるかにオブジェクト指向になります。

4
Javid Jamae
HashMap<String, Object> savedStuff = new HashMap<String, Object>();

もちろん、要素を抽出するときは、正しいタイプを使用するように注意する必要があります。

7

以下に示すように generics を使用する必要があります:

Map<String, Object> savedStuff = new HashMap<String, Object>();
7
fastcodejava

HashMap<String, Object>を使用することは、同じマップに異種の値を含めることを主張する場合におそらく最善の方法です。それらを取得するときに役立つことを行うには、それらをキャストする必要があります(およびそれらをキャストするタイプをどのように知るのでしょうかto ...?)ですが、少なくともkeysに関してはタイプセーフになります。

4
Alex Martelli

別のアプローチは次のとおりです。

マップを含み、マップのさまざまなビューを提供するヘルパークラス:

_public class ValueStore {


    /**
     * Inner map to store values.
     */
    private final Map<String,Object> inner = new HashMap<String,Object>();

    /**
     * Returns true if the Value store contains a numeric value for this key.
     */
    public boolean containsIntValue(final String key){
        return this.inner.get(key) instanceof Integer;
    }


    /**
     * Returns true if the Value store contains a String value for this key.
     */
    public boolean containsStringValue(final String key){
        return this.inner.get(key) instanceof String;
    }

    /**
     * Returns the numeric value associated with this key.
     * @return -1 if no such value exists
     */
    public int getAsInt(final String key){
        final Object retrieved = this.inner.get(key);
        return retrieved instanceof Integer ? ((Integer) retrieved).intValue() : -1;
    }


    /**
     * Returns the String value associated with this key.
     * @return null if no such value exists
     */
    public String getAsString(final String key){
        final Object retrieved = this.inner.get(key);
        return retrieved instanceof String ? (String) retrieved : null;
    }

    /**
     * Store a string value.
     */
    public void putAsInt(final String key, final int value){
        this.inner.put(key, Integer.valueOf(value));
    }


    /**
     * Store an int value.
     */
    public void putAsString(final String key, final String value){
        this.inner.put(key, value);
    }

    /**
     * Main method for testing.
     */
    public static void main(final String[] args) {
        final ValueStore store = new ValueStore();
        final String intKey = "int1";
        final String stringKey = "string1";
        final int intValue = 123;
        final String stringValue = "str";

        store.putAsInt(intKey, intValue);
        store.putAsString(stringKey, stringValue);

        assertTrue(store.containsIntValue(intKey));
        assertTrue(store.containsStringValue(stringKey));
        assertFalse(store.containsIntValue(stringKey));
        assertFalse(store.containsStringValue(intKey));
        assertEquals(123, store.getAsInt(intKey));
        assertEquals(stringValue, store.getAsString(stringKey));
        assertNull(store.getAsString(intKey));
        assertEquals(-1, store.getAsInt(stringKey));
    }

}
_

Int値を取得する前に、store.containsIntValue(intKey)の値を確認し、String値を取得する前に、store.containsStringValue(stringKey)を確認します。そうすれば、間違ったタイプの値を取得することはありません。

(もちろん、他のタイプもサポートするように拡張できます)

2

これは、ハッシュマップを使用するための単純なコードです。そこで、整数としてキーを使用し、文字列型として値を使用します。マップは、機能がキーと値のペアで機能する場合に非常に役立ちます。以下は、ハッシュマップの使用の簡単な例です。それがすべての人にとって非常に役立つことを願っています。

public class CreateHashMap {

    public static void main(String[] args) {

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

    /*
     * Associates the specified value with the specified key in 
       this map (optional operation). If the map previously 
       contained a mapping for the key, the old value is 
       replaced by the specified value
     */
        map.put(1,"ankush");
        map.put(2, "amit");
        map.put(3,"shivam");
        map.put(4,"ankit");
        map.put(5, "yogesh");

        //print hashmap
        System.out.println("HashMap = "+map);


    }

}

参照: マップの作成と使用

1
Anuj Dhiman