Ich habe eine Liste von Strings. Ich möchte jede Zeichenfolge basierend auf einer Funktion, die ein Double zurückgibt, auswerten. Dann möchte ich die ersten 5 Strings, basierend auf ihren berechneten Werten. Wenn es weniger als 5 gibt, möchte ich alle (in der Reihenfolge). Nehmen wir an, die Strings sind chemische Verbindungen und die Funktion berechnet die Masse. Die Funktion ist rechenintensiv; Ich muss es einmal pro String auswerten. (Ich bin hier nur Daten bilden, though.)Erste N-Werte einer Karte <K, V> sortiert nach Wert
H2O => 18.5
C12H11O22 => 109.1
HeNe => 32.0
H2SO4 => 54.37
HCl => 19.11
4FeO3 => 82.39
Xe6 => 281.9
Das Programm sollte die ersten fünf Saiten, um durch ihre jeweiligen Werte angeordnet zurückzukehren. Für diese Beispieldaten: H20, HCl, HeNe, H2SO4, 4FeO3
. Eigentlich interessiert mich die Bestellung nicht wirklich; Ich brauche nur die fünf niedrigsten in beliebiger Reihenfolge.
Ich dachte darüber nach, wie ich das in Perl machen würde. Es sind nur ein paar Zeilen:
foreach $s (@str) {
$strmap{$s} = f($s);
}
@sorted = sort { $strmap{$a} <=> $strmap{$b} } keys %strmap;
return @sorted[0, 4]
Aber ich muss es in Java tun. Und es macht mich verrückt.
Zuerst habe ich versucht, eine HashMap<String, Double>
zu füllen, dann mit einem benutzerdefinierten Komparator, genau wie die Perl-Version. Durch die Festlegung des Komparators wurde jedoch verhindert, dass die HashMap verwendet wurde, um die Werte abzurufen.
Dann versuchte ich eine TreeMap<String, Double>
, aber es sortiert nur nach Schlüssel und kein Betrag der Zwangsführung könnte es bekommen, um die Einträge nach Wert zu ordnen.
Also versuchte ich eine TreeMap<Double, String>
. Es wird Einträge mit demselben Double verwerfen. Allerdings ist die Wahrscheinlichkeit, dass Strings die gleiche Double-Map haben, gering, also habe ich weitergedrückt. Das Hinzufügen der Einträge zur TreeMap ist kein Problem, aber ich stieß auf Probleme, die versuchen, die Werte daraus zu extrahieren.
TreeMap stellt eine Methode namens subMap
bereit, die Parameter sind jedoch die Schlüssel, die die Teilmenge begrenzen. Ich weiß nicht, was sie sind; Ich will nur die ersten fünf von ihnen. Also habe ich versucht, die values
Methode zu verwenden, um alle Werte aus der TreeMap zu bekommen, in der Hoffnung, dass sie in Ordnung sind. Dann kann ich nur die ersten zehn bekommen.
ArrayList<String> strs = (ArrayList<String>)(treemap.values());
return new ArrayList<String>(strs.subList(0, 5));
Nein. Laufzeitfehler: TreeMap $ Values kann nicht in ArrayList umgewandelt werden.
List<String> strs = (List<String>)(treemap.values());
return new ArrayList<String>(strs.subList(0, 5));
Gleich. Laufzeitfehler, der versucht, die Besetzung zu tun. OK, lassen Sie uns einfach auf eine Sammlung zuweisen ...
Collection<String> strs = treemap.values();
return new ArrayList<String>(strs.subList(0, 5));
Sorry, subList
keine Methode Collection enthalten ist.
Collection<String> strs = treemap.values();
ArrayList<String> a = new ArrayList<String>(strs);
return new ArrayList<String>(a.subList(0, 5));
Endlich etwas, das funktioniert! Aber zwei zusätzliche Datenstrukturen, nur um die ersten fünf Elemente zu bekommen? Und ich bin nicht zu wild, Double als Schlüssel für TreeMap zu verwenden.
Gibt es eine bessere Lösung?
Könnten Sie bitte einige Beispiele zur Verfügung stellen, um die Frage besser zu verstehen – asifsid88
Beispieldaten? Oder Beispiele Code der Dinge, die ich ausprobiert habe? –
Mit Beispieldaten meine ich eine Reihe von Eingaben gegeben was ist die erwartete Ausgabe – asifsid88