我已经创建了一个方法,它接受一个hashmap作为输入,将值转换成一个数组,使用气泡排序对数组进行排序,然后我希望它使用排序后的值从初始hashmap中选择前N个索引键。我知道这不是最好的方法,但这是好的(我写了这个方法作为一个替代)。
该方法返回null,因为maxItems为空,并且“System.out.println(Entry.GetKey());”不会将任何内容打印到控制台。
谢谢你的帮助!
public String[]getMaxListAlt(int n,HashMap
itemCount.values().toArray();
Integer[] maxArray = itemCount.values().toArray(new Integer[0]);
int length = maxArray.length;
for (int i = 0; i < length-1; i++)
for (int j = 0; j < length-i-1; j++)
if (maxArray[j] > maxArray[j+1])
{
int temp = maxArray[j];
maxArray[j] = maxArray[j+1];
maxArray[j+1] = temp;
}
String[] maxItems = new String[n];
int maxIndex = n-1;
System.out.println(maxIndex);
for (int i=0; i >= n-1; i++) {
for (Map.Entry<String, Integer> entry : itemCount.entrySet()) {
if (entry.getValue().equals(maxArray[i])) {
System.out.println(entry.getKey());
maxItems[i] = entry.getKey();
}
}
}
for (int counts : maxArray) {
System.out.println(counts);
}
return maxItems;
}
如果我理解你正在尝试做什么,这里有另一种方法,你可能会感兴趣。然而,看起来你可能做错了几件事。
entryset
时,您会得到重复的值,因为您总是得到具有特定数字的第一个值。但这可能是您已有的内容的重复。下面的流式处理是这样工作的。
groupingby
entryset
流式传输,并根据值(计数)按降序排序n
并将键映射到流创建一些测试数据
Random r = new Random();
String[] v = r.ints(100, 'a', 'z' + 1)
.mapToObj(c -> (char) c + "").toArray(String[]::new);
int n = 10;
流式处理
Map<String, Long> itemCount = Arrays.stream(v)
.collect(Collectors.groupingBy(a -> a, Collectors.counting()));
String[] result = itemCount.entrySet()
.stream()
.sorted(Entry.<String,Long>comparingByValue().reversed())
.limit(n).map(Entry::getKey).toArray(String[]::new);
for (int i = 0; i < result.length; i++) {
System.out.println(result[i] + " --> " + itemCount.get(result[i]));
}
打印类似于
h --> 7
q --> 7
t --> 7
f --> 6
a --> 5
e --> 5
m --> 5
x --> 5
z --> 5
d --> 4
注意,如果需要,第一个流可以通过流entrySet()
直接流入第二个流。在这种情况下,您返回数组,却看不到实际的映射。
如果要保留原始地图
这里是一个带有注释的修改,如果你想使用你的原始地图和方法。
public static String[] getMaxListAlt(int n,
Map<String, Long> itemCount) {
// copy entries to a list for sorting.
List<Entry<String,Long>> entries = new ArrayList<>(itemCount.entrySet());
// sort the entries based on value in reverse order.
entries.sort(Entry.<String,Long>comparingByValue().reversed());
// now create the array and just grab the top n items from the sorted
// entries list.
String[] maxItems = new String[n];
for (int i = 0; i < n; i++) {
maxItems[i] = entries.get(i).getKey();
}
return maxItems;
}
您的for
-循环没有运行,因为您有一个键入-int i=0;i>=n-1;
但您的i
永远不能大于您的n-1
。相反:
for (int i=0; i <= n-1; i++) {
for (Map.Entry<String, Integer> entry : itemCount.entrySet()) {
我正在尝试使用一个以我的类单元格为键的HashMap。但是,在将项放入HashMap之后,对该项调用contains将返回false。 这会打印出false和true,在这里应该打印true和true,因为根据映射,docs containsKey使用.equals()。我做错了什么?
问题内容: 考虑以下代码: 程序的输出为: 这里,键如何相互关联。是否所有三个都分配给相同的哈希码?如果是,为什么? 由于这三个值看起来都不同,因此一个值的更改会更改另一个值。这是否意味着只将一个密钥项输入 到任一密钥中,因为所有密钥项都被视为相同的密钥。 问题答案: 当将 null 作为键传递并且null作为特殊情况处理时,不会调用哈希码。 放置方法 将 null 键放在存储区 0中, 并将 n
我有一个包含通过构造函数创建的对象的hashmap。这些对象在hashmap中 我有一个比较两个数组的函数。一个数组是手动创建的,但第二个数组是通过一个方法创建的。我只需要来自HashMap的值。 我被这种方法困住了... 如果取出.toArray(),将得到一个“无法从集合 转换为brick” 如果将.toArray()更改为.toString(),则会得到一个“无法从String转换为bric
我尝试了一些变体,但没有运气返回GraphQL中的地图。因此,我有以下两个对象: 我的模式如下: 有人能告诉我如何实现这一点,以便GraphQL神奇地处理这一点或另一种方法。 非常感谢!
问题内容: 是否有可能为集合中未找到的所有键返回默认值? 问题答案: [更新] 正如其他答案和评论者所指出的那样,从Java 8开始,您可以简单地调用。 [原版的] 没有Map实现可以完全做到这一点,但是通过扩展HashMap来实现自己的实现很简单:
问题内容: 我只是在阅读有关Java中HashMap和HashTable类之间的区别。在那里,我发现了一个区别,即前者允许空键,而后者则没有特权。就HashMap的工作而言,我知道,它在键上调用hashcode方法,以查找要在其中放置该键值对的存储桶。我的问题来了:如何计算空值的哈希码?或者空键的哈希码是否有任何默认值(如果需要,请指定该值)? 问题答案: 从HashMap: 如果进一步看,您会发