Mam listę ciągów znaków. Chcę ocenić każdy ciąg na podstawie funkcji zwracającej podwójne. Następnie chcę pierwszych 5 ciągów, na podstawie ich obliczonych wartości. Jeśli jest ich mniej niż 5, chcę je wszystkie (w kolejności). Powiedzmy, że łańcuchy są związkami chemicznymi, a funkcja oblicza masę. Funkcja jest kosztowna pod względem obliczeniowym; Muszę to ocenić raz na ciąg. (Ja tylko tworzących dane tutaj, choć.)Pierwsze wartości N mapy <K, V> posortowane według wartości
H2O => 18.5
C12H11O22 => 109.1
HeNe => 32.0
H2SO4 => 54.37
HCl => 19.11
4FeO3 => 82.39
Xe6 => 281.9
Program powinien powrócić pierwsze pięć strun ułożone w kolejności według ich wartości. Dla tych przykładowych danych: H20, HCl, HeNe, H2SO4, 4FeO3
. Właściwie to nie zależy mi na zamówieniu; Potrzebuję tylko pięciu najniższych w dowolnej kolejności.
Zastanowiłem się, jak to zrobić w Perlu. To tylko kilka linii:
foreach $s (@str) {
$strmap{$s} = f($s);
}
@sorted = sort { $strmap{$a} <=> $strmap{$b} } keys %strmap;
return @sorted[0, 4]
Ale muszę to zrobić w Javie. I doprowadza mnie to do szału.
Najpierw próbowałem zapełnić HashMap<String, Double>
, a następnie użyć Collections.sort
z niestandardowym komparatorem, tak jak wersja Perla. Jednak ustalenie zakresu na Komparatorze uniemożliwiło mu odwołanie się do HashMap w celu sprawdzenia wartości.
Potem próbowałem TreeMap<String, Double>
, ale sortuje się tylko według klucza i żadna ilość wymuszenia nie może go zmusić do uporządkowania wpisów według wartości.
Próbowałem więc TreeMap<Double, String>
. Odrzuci wpisy z tym samym Double. Jednak prawdopodobieństwo posiadania Strings, które mapują do tego samego Double jest niska, więc naciskałem do przodu. Dodanie wpisów do TreeMap nie stanowi problemu, ale napotkałem problemy próbujące wyodrębnić z niego wartości.
TreeMap dostarcza metodę o nazwie subMap
, ale jej parametry są kluczami ograniczającymi podzbiór. Nie wiem, czym one są; Chcę tylko pierwszych pięciu z nich. Próbowałem więc użyć metody values
, aby uzyskać wszystkie wartości z TreeMap, mając nadzieję, że będą w porządku. Wtedy mogę dostać pierwszą dziesiątkę.
ArrayList<String> strs = (ArrayList<String>)(treemap.values());
return new ArrayList<String>(strs.subList(0, 5));
Nie. Runtime error: nie można przesłać TreeMap $ Values do ArrayList.
List<String> strs = (List<String>)(treemap.values());
return new ArrayList<String>(strs.subList(0, 5));
To samo. Wystąpił błąd podczas wykonywania rzutowania. OK, niech po prostu przypisać do kolekcji ...
Collection<String> strs = treemap.values();
return new ArrayList<String>(strs.subList(0, 5));
Niestety, subList
nie jest metodą Collection.
Collection<String> strs = treemap.values();
ArrayList<String> a = new ArrayList<String>(strs);
return new ArrayList<String>(a.subList(0, 5));
Wreszcie coś, co działa! Ale dwie dodatkowe struktury danych tylko po to, by zdobyć pierwsze pięć elementów? I nie jestem za bardzo szalony, że używam Double jako klucza do TreeMap.
Czy istnieje lepsze rozwiązanie?
Czy możesz podać kilka próbek, aby lepiej zrozumieć pytanie? – asifsid88
Przykładowe dane? Lub próbkuje kod rzeczy, które próbowałem? –
Przez przykładowe dane mam na myśli dany zestaw wejść, co jest oczekiwanym wyjściem – asifsid88