ダニエル・ベネディクト:
Javaで文字列配列にリスト要素を配置する方法はありますか?私は、カスタムコンパレータを使用して値によって地図をソートし、今で配列にキー(文字列)の要素を入れしようとしています。私が見つけた唯一の方法は、同時にアレイと分類されたリストをループして、アレイそのように埋めるが、それはそれだけに最後の要素を入れています。
例:ソートなしのマイマップ: {a=5, b=2, c=8, d=1}
カスタムコンパレータでソートした後: [c=8, a=5, b=2, d=1]
今、私は単にキー値(配置する必要がc,a
タプルになど)タプルの長さです。final String[] lettersWithBigValues = new String[n]
n
しかし、後:
for (int i = 0; i < Integer.parseInt(args[1]); i++) { System.out.println(lettersWithBigValues[i]+","); }
コンソールは戻っています:d,d,d,d
コンソールライン引数が4であることを考えます
ここでは、完全な機能は次のとおりです。
public String[] getTopLettersWithValues(final int n){
final String[] lettersWithBigValues = new String[n];
final Map<String, Integer> myMap = new HashMap<>();
int counter = 0;
for (final List<String> record : records) {
if (!myMap.containsKey(record.get(1))) {
myMap.put(record.get(1), counter += Integer.parseInt(record.get(4)));
} else {
myMap.computeIfPresent(record.get(1), (k,v) -> v + Integer.parseInt(record.get(4)));
}
}
System.out.println(myMap);
List<Map.Entry<String, Integer>> sorted = new LinkedList<>(myMap.entrySet());
// Sort list with list.sort(), using a custom Comparator
sorted.sort(valueComparator);
System.out.println(sorted);
for (int i = 0; i < lettersWithBigValues.length; i++) {
for (Map.Entry<String, Integer> values: sorted) {
lettersWithBigValues[i] = values.getKey();
}
}
return lettersWithBigValues;
}
レコードがデータの一覧がある場合は、CSVファイルから読み込みます。
そして、ここでコンパレータは次のとおりです。
public Comparator<Map.Entry<String, Integer>> valueComparator = (o1, o2) -> {
Integer v1 = o1.getValue();
Integer v2 = o2.getValue();
return v2.compareTo(v1);
};
また:
次のようにキーの配列を達成することができます。
String [] lettersWithBigValues = myMap.entrySet().stream() // entries of your intial map
.sorted(valueComparator) // sorted by your comparator
.map(Map.Entry::getKey) // mapped to only the key e.g. 'd', 'a'
.toArray(String[]::new); // converted to array