当前位置: 首页 > 知识库问答 >
问题:

尝试从返回null的hashmap值数组生成hashmap键数组

寇甫
2023-03-14

我已经创建了一个方法,它接受一个hashmap作为输入,将值转换成一个数组,使用气泡排序对数组进行排序,然后我希望它使用排序后的值从初始hashmap中选择前N个索引键。我知道这不是最好的方法,但这是好的(我写了这个方法作为一个替代)。

该方法返回null,因为maxItems为空,并且“System.out.println(Entry.GetKey());”不会将任何内容打印到控制台。

谢谢你的帮助!

public String[]getMaxListAlt(int n,HashMap itemCount){

    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;
}

共有2个答案

许阿苏
2023-03-14

如果我理解你正在尝试做什么,这里有另一种方法,你可能会感兴趣。然而,看起来你可能做错了几件事。

  1. 您的冒泡排序是按升序排序的,我想您不想这样做。
  2. 在循环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;
} 
衡建中
2023-03-14

您的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: 如果进一步看,您会发