Come posso creare una tabella hash in Java?
Domanda
Qual è il modo più semplice per creare una tabella hash (o un array associativo...) in Java?Il mio google-fu ha mostrato un paio di esempi, ma esiste un modo standard per farlo?
Ed esiste un modo per popolare la tabella con un elenco di coppie chiave->valore senza chiamare individualmente un metodo di aggiunta sull'oggetto per ciascuna coppia?
Soluzione
Map map = new HashMap();
Hashtable ht = new Hashtable();
Entrambe le classi possono essere trovate nel pacchetto java.util.La differenza tra i 2 è spiegata di seguito Voce delle domande frequenti su jGuru.
Altri suggerimenti
È possibile utilizzare le doppie parentesi graffe per impostare i dati.Chiami ancora add o put, ma è meno brutto:
private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{
put("foo", 1);
put("bar", 256);
put("data", 3);
put("moredata", 27);
put("hello", 32);
put("world", 65536);
}};
Inoltre, non dimenticare che sia Map che Hashtable sono generici in Java 5 e versioni successive (come in qualsiasi altra classe del Quadro delle collezioni).
Map<String, Integer> numbers = new HashMap<String, Integer>();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
Integer one = numbers.get("one");
Assert.assertEquals(1, one);
import java.util.HashMap;
Map map = new HashMap();
Che cosa Edmund disse.
Per quanto riguarda il non chiamare .add in continuazione, no, non in modo idiomatico.Ci sarebbero vari hack (memorizzarlo in un array e poi ripeterlo in loop) che potresti fare se lo volessi davvero, ma non lo consiglierei.
Ed esiste un modo per popolare la tabella con un elenco di coppie chiave->valore senza chiamare individualmente un metodo di aggiunta sull'oggetto per ciascuna coppia?
Un problema con la tua domanda è che non menzioni in quale forma sono i tuoi dati per cominciare.Se il tuo elenco di coppie fosse un elenco di oggetti Map.Entry, sarebbe piuttosto semplice.
Giusto per buttarlo via, esiste una classe (molto diffamata) denominata java.util.Properties che è un'estensione di Hashtable.Si aspetta solo chiavi e valori String e consente di caricare e archiviare i dati utilizzando file o flussi.Il formato del file che legge e scrive è il seguente:
key1=value1
key2=value2
Non so se è quello che stai cercando, ma ci sono situazioni in cui può essere utile.
È importante notare che la funzione hash di Java non è ottimale.Se desideri meno collisioni e l'eliminazione quasi completa del re-hashing con una capacità di circa il 50%, utilizzerei un algoritmo Buz Hash Buz Hash
Il motivo per cui l'algoritmo di hashing di Java è debole è più evidente nel modo in cui esegue l'hashing delle stringhe.
"a".hash()
darti la rappresentazione ASCII di "a"
- 97
, COSÌ "b"
sarebbe 98
.Lo scopo principale dell'hashing è assegnare un numero arbitrario e "il più casuale possibile".
Se hai bisogno di una tabella hash veloce e sporca, usala assolutamente java.util
.Se stai cercando qualcosa di robusto e più scalabile, cercherei di implementarne uno tuo.
Hashtable<Object, Double> hashTable = new Hashtable<>();
mettere valori ...
ottieni il massimo
Optional<Double> optionalMax = hashTable.values().stream().max(Comparator.naturalOrder());
if (optionalMax.isPresent())
System.out.println(optionalMax.get());