Pergunta

Eu preciso armazenar chave informações valor / em algum tipo de coleção. Em C #, eu definir um dicionário como este:

var entries = new Dictionary<string, int>();
entries.Add("Stop me", 11);
entries.Add("Feed me", 12);
entries.Add("Walk me", 13);

Então gostaria de acessar os valores da seguinte forma:

int value = entries["Stop me"];

Como posso fazer isso em Java? Eu vi exemplos com ArrayList, mas eu gostaria a solução com os genéricos, se possível.

Foi útil?

Solução

Você quer usar um Map

Map<String, Integer> m = new HashMap<String, Integer>();
m.put("Stop me", 11);
Integer i = m.get("Stop me"); // i == 11

Note que na última linha, eu poderia ter dito:

int i = m.get("Stop me");

O que é um atalho para (com Java auto-unboxing):

int i = m.get("Stop me").intValue()

Se não houver nenhum valor no mapa na chave dada, o get null retornos e esta expressão lança uma NullPointerException. Por isso, é sempre uma boa idéia para usar o tipo box Integer neste caso

Outras dicas

Use um java.util.Map. Existem várias implementações:

  • HashMap: O (1) pesquisa, não manter a ordem de chaves
  • TreeMap: O (log n) de pesquisa, mantém a ordem das chaves, para que você possa interagir sobre los em uma ordem garantida
  • LinkedHashMap:. O (1) pesquisa, itera sobre as teclas na ordem em que foram adicionadas ao mapa

Você usá-los como:

Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Stop me", 11);
map.put("Feed me", 12);

int value = map.get("Stop me");

Para maior comodidade de trabalho com coleções, ter um olhar para o biblioteca do Google Collections . É excelente.

Você usar um Map em Java.

Note que você não pode usar int (ou qualquer outro tipo primitivo) como um parâmetro de tipo genérico, mas por causa de autoboxing, ele ainda se comporta quase , como se fosse um Map<String, int> em vez de um Map<String, Integer> . (Você não quer estar fazendo um monte de autoboxing em código sensível ao desempenho, no entanto.)

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;
    ...
}

Parece que você está procurando algo como HashMap

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;

como alternativa você pode tentar Ajustes:

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
    }
}

teste:

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

Você definitivamente quer um HashMap, que é a versão Java do C # Dictionary.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top