HashMap : Hinzufügen von Werten mit gemeinsamen Tasten, und drucken Sie Sie aus
Habe ich die Datei die Zeichenkette in der form key/value
- pair-Mädchen wie Menschen und zählen, Beispiel wäre
"Reggy, 15"
"Jenny, 20"
"Reggy, 4"
"Jenny, 5"
und in der Ausgabe, die ich hätte summiert alle Werte, basierend auf Schlüssel-also für unser Beispiel-Ausgabe wäre
"Reggy, 19"
"Jenny, 25"
Hier ist mein Ansatz:
- Lesen Sie jede Zeile und für jede Zeile key bekommen und Zählung mit scanner und mit
,
als Trennzeichen - Nun sehen, ob der Schlüssel schon vorhanden ist, bevor, wenn, dann nur hinzufügen currentValues zu previousValues wenn nicht, dann nehmen Sie currentValue als Wert der HashMap.
Beispiel-Implementierung:
public static void main(final String[] argv) {
final File file = new File("C:\\Users\\rachel\\Desktop\\keyCount.txt");
try {
final Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
if (scanner.hasNext(".*,")) {
String key;
final String value;
key = scanner.next(".*,").trim();
if (!(scanner.hasNext())) {
//pick a better exception to throw
throw new Error("Missing value for key: " + key);
}
key = key.substring(0, key.length() - 1);
value = scanner.next();
System.out.println("key = " + key + " value = " + value);
}
}
} catch (final FileNotFoundException ex) {
ex.printStackTrace();
}
}
Teil ich bin mir nicht klar darüber ist, wie sich zu teilen Schlüssel/Wert-paar beim Lesen und erstellen von HashMap, die Grundlage.
Ist auch der Ansatz am Vorschlag ist eine optimale oder gibt es eine Möglichkeit zur Verbesserung der Leistung mehr.
- haben Sie versucht, die
java.util.HashMap#containsKey(),put(),get()
? - Es ist "pseudocode" 🙂 en.wikipedia.org/wiki/Pseudocode
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da ist es fast sicher eine Lernübung, ich werde bleiben Weg von schreiben von code, sodass Sie den ganzen Spaß haben.
Erstellen Sie eine
HashMap<String,Integer>
. Jedes mal, wenn Sie sehen, ein Schlüssel/Wert-paar, überprüfen Sie, ob der hash-Karte hat einen Wert für den Schlüssel (verwenden Sie 'containsKey(key)'). Wenn es funktioniert, bekommen, der alte Wert mitget(key)
fügen Sie den neuen Wert ein, und speichern Sie das Ergebnis wieder mitput(key, newValue)
. Wenn der key noch nicht da ist, eine neue hinzufügen - wieder, mitput
. Vergessen Sie nicht, stellen Sie eineint
aus, wenn dieString value
(verwenden SieInteger.valueOf(value)
für die).Soweit Optimierung geht, ist jede Optimierung an dieser Stelle wäre verfrüht: es gar nicht funktioniert! Es ist jedoch schwer zu bekommen, viel schneller als eine einzelne Schleife, die Sie haben, die ist auch Recht einfach.
Scanner
Zeilen gelesen, und verwenden Sie dannsplit
werfen Sie einen Blick auf dieses Beispiel auf ideone für eine demo.Versuchen Sie dies:
looks like
ist kein gutes argument.Einfachste Weg, woran ich denken kann die Aufteilung der Werte:
Ist es wahrscheinlich nicht der effizienteste Weg, in Bezug auf Leistung, aber ist ziemlich einfach.
Scanner
ist in der Regel verwendet für die Analyse, aber die Analyse hier nicht so Komplex, ist nur eine Teilung der Streicher.Für das Lesen in, persönlich würde ich verwenden:
Scanner.nextLine()
,String.split(",")
, undInteger.valueOf(value)
Art von spät, aber eine saubere Lösung mit Zeit-Komplexität von O(n). Diese Lösung umgeht Sortieren von arrays