【发布时间】:2020-06-28 19:30:18
【问题描述】:
有没有办法将列表元素放入 java 中的 String 数组?我使用自定义比较器按值对 Map 进行排序,现在尝试将 key(String) 元素放入数组中。我发现的唯一方法是同时遍历数组和排序列表并以这种方式填充数组,但它只将最后一个元素放入其中。
示例:
我的地图没有排序:{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;
}
其中 records 是从 csv 文件中读取的数据列表。
这里是比较器:
public Comparator<Map.Entry<String, Integer>> valueComparator = (o1, o2) -> {
Integer v1 = o1.getValue();
Integer v2 = o2.getValue();
return v2.compareTo(v1);
};
【问题讨论】:
-
如果您的输入映射中有奇数个条目,那么您将如何形成元组?你的预期输出是什么?
-
@Naman 奇数条目永远不会出现,因为它们是从 csv 文件中读取的。我的预期输出是一个字符串元组,其中包含排序列表中的所有键值(但据我所知,列表没有键值)。但不知何故,我仍然能够将 d 放入元组中,这就是我不太了解的。
-
@DanielBenedek 您需要共享从输入映射到排序映射的转换中使用的代码,以便进一步说明。
-
@Naman 我更新了上面的链接,请看一下
标签: java arrays list sorting comparison