私はストリングのリストを持っています。私はダブルを返す関数に基づいて各文字列を評価したいと思います。次に、計算された値に基づいて最初の5つの文字列が必要です。 5未満の場合、私はそれらのすべてを(順番に)欲しい。文字列が化学化合物であり、関数が質量を計算するとします。関数は計算上高価です。私はそれを文字列ごとに一度評価する必要があります。 (私はちょうどかかわらず、ここにデータを作ってるんだ。)マップの最初のN値<K, V>値でソート
H2O => 18.5
C12H11O22 => 109.1
HeNe => 32.0
H2SO4 => 54.37
HCl => 19.11
4FeO3 => 82.39
Xe6 => 281.9
プログラムは、それぞれの値によって順に並べ、最初の5つの文字列を返す必要があります。このサンプルデータはH20, HCl, HeNe, H2SO4, 4FeO3
です。実際には、私は本当に秩序を気にしません。私はちょうど5つの順序で任意の最低必要があります。
私はこれをPerlでどうやってやるのか考えました。それはほんの数行です:
foreach $s (@str) {
$strmap{$s} = f($s);
}
@sorted = sort { $strmap{$a} <=> $strmap{$b} } keys %strmap;
return @sorted[0, 4]
しかし、私はそれをJavaで行う必要があります。そしてそれは私を夢中にさせている。
最初にHashMap<String, Double>
を入力してから、Collections.sort
をPerlバージョンと同様にカスタムコンパレータを使って投入しようとしました。しかし、Comparatorをスコープすることで、HashMapを参照して値を参照することができなくなりました。
次に、私はTreeMap<String, Double>
を試しましたが、キーで並べ替えるだけで、値によってエントリを並べ替えることができませんでした。
私はTreeMap<Double, String>
を試しました。同じDoubleのエントリは破棄されます。しかし、同じDoubleにマッピングされるStringの可能性は低いので、私は前に押しました。 TreeMapにエントリを追加することは問題ありませんが、そこから値を抽出しようとする問題に遭遇しました。
TreeMapはsubMap
というメソッドを提供しますが、そのパラメータはサブセットを区切るキーです。私は彼らが何であるかを知らない。私はちょうどそれらの最初の5つをしたい。だから私はvalues
メソッドを使ってTreeMapからすべての値を取得しようとしました。それから私はちょうど最初の10を得ることができます。
ArrayList<String> strs = (ArrayList<String>)(treemap.values());
return new ArrayList<String>(strs.subList(0, 5));
いいえ。ランタイムエラー:TreeMap $値をArrayListにキャストできません。
List<String> strs = (List<String>)(treemap.values());
return new ArrayList<String>(strs.subList(0, 5));
と同じです。実行時にエラーが発生しました。 OK、
Collection<String> strs = treemap.values();
return new ArrayList<String>(strs.subList(0, 5));
申し訳ありませんが、subList
はコレクションの方法ではありません...ちょうどコレクションに割り当てることができます。
Collection<String> strs = treemap.values();
ArrayList<String> a = new ArrayList<String>(strs);
return new ArrayList<String>(a.subList(0, 5));
最後に、機能するものがあります。しかし、最初の5つの要素を取得するための2つの余分なデータ構造はありますか? TreeMapのキーとしてDoubleを使用することについてはあまり野生ではありません。
もっと良い解決策はありますか?
質問をよりよく理解するためのサンプルを提供してください。 – asifsid88
サンプルデータ?または私が試したことのサンプルコード? –
サンプルデータには、入力のセットを指定すると、期待される出力は何ですか? – asifsid88