【问题标题】:Update HashMap/ArrayList passed to PriorityQueue Comparator更新传递给 PriorityQueue 比较器的 HashMap/ArrayList
【发布时间】:2016-11-07 03:54:59
【问题描述】:

我为 PriorityQueue 编写了一个比较器,以便它会根据 HashMap 中 ArrayList 中的第一个值给我最小值。

我的问题是,在我的程序的其余部分中,我需要更新/更改 ArrayList 中的第一个值。我不确定如何确保优先级队列始终根据更新为我提供正确的结果?

谢谢

public class MyComparator implements Comparator<Integer>{
    HashMap<Integer, ArrayList<Integer>> hm;
    public MyComparator(HashMap<Integer, ArrayList<Integer>> hm){
        this.hm = hm;
    }
    @Override
    public int compare (Integer num, Integer num1){
        ArrayList<Integer> list = hm.get(num);
        int w = list.get(0);
        ArrayList<Integer> list1 = hm.get(num1);
        int w1 = list1.get(0);
        if(w1 - w == 0){
            return 0;
        }
        if(w1 - w <= 0){
            return 1;
        }
        else{
            return -1;
        }
    }
}

【问题讨论】:

  • 它会在您调用比较方法时为您提供正确的结果。另外,只是提一下它不应该是if(w1 - w &lt; 0){ return 1;}
  • 所以每次我做PriorityQueue.peek()时都会调用比较方法; ?因此使用更新的哈希映射/数组列表?是的,感谢您指出...'='不应该在那里

标签: java hashmap priority-queue comparator


【解决方案1】:

如果您更改用作 PriorityQueue 中的键的值,则需要调整队列以反映更改。否则,您的队列可能处于无效状态。数据结构无法跟踪您对用作键的任何值所做的更改。如果更改键,则必须通知数据结构发生了变化。

当您调用peek 时,队列明确地不会重新组织自己。 peek 所做的只是返回队列中的第一项。它进行的唯一比较是查看队列是否为空。

重新组织 Java PriorityQueue 的唯一方法是删除您更改的元素,然后重新插入它。

【讨论】:

    猜你喜欢
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 2017-06-25
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多