Как правильно использовать HashMap? - PullRequest
12 голосов
/ 04 сентября 2010
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  

Ответы [ 6 ]

7 голосов
/ 04 сентября 2010

Вам необходимо использовать генерики , как показано ниже:

Map<String, Object> savedStuff = new HashMap<String, Object>();
7 голосов
/ 04 сентября 2010
HashMap<String, Object> savedStuff = new HashMap<String, Object>();

Конечно, вы все равно должны быть осторожны, чтобы использовать правильный тип при извлечении элементов.

4 голосов
/ 04 сентября 2010

Я не уверен, что вы пытаетесь сделать, но поскольку в приведенном вами примере для индексации данных используются жестко закодированные строки, кажется, что вы знаете, какие данные вы хотите сгруппировать вместе. Если это так, то карта, вероятно, не является хорошим выбором. Лучшим подходом было бы сделать класс из обычно сгруппированных данных:

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 голосов
/ 04 сентября 2010

Использование HashMap<String, Object>, вероятно, лучшее, что вы можете сделать, если вы настаиваете на наличии неоднородных значений на одной и той же карте - вам нужно привести эти , чтобы сделать что-нибудь полезное при их получении (и как вы узнаете, к какому типу их приводить к ...?), но, по крайней мере, вы будете безопасны с точки зрения ключей .

2 голосов
/ 04 сентября 2010

Вот другой подход:

Класс Helper, который содержит карту и предоставляет различные ее представления:

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), и прежде чем вы получите строковое значение, вы должны проверить store.containsStringValue(stringKey).Таким образом, вы никогда не получите значения неправильного типа.

(Конечно, может быть расширен и для поддержки других типов)

1 голос
/ 04 декабря 2015

Это простой код для использования hashmap.Там я буду использовать ключ как целое число и значение как строковый тип.Карта очень полезна, когда наша функциональность работает с парами ключ-значение.Ниже приведен простой пример использования hashmap.Я надеюсь, что это очень полезно для всех.

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);


    }

}

Ссылка: Создание и использование карты

...