在 Java 中将键和值添加到优先级队列中并按键排序

2022-09-03 03:44:01

我正在尝试接收字符串列表,并将它们添加到具有键和值的优先级队列中。键是单词,值是单词的字符串值。然后,我需要首先对具有最高字符串值的队列进行排序。优先级队列不允许我添加 2 个值。

public static List<String> pQSortStrings(List<String> strings) {
    PriorityQueue<String, Integer> q = new PriorityQueue<>();

    for (int x = 0; x < strings.size(); x++) {
        q.add(strings.get(x),calculateStringValue(strings.get(x)));
    }
    return strings;
}

答案 1

问题

优先级队列可以在其每个节点中存储单个对象。因此,您要做的事情无法按原样完成。

但是,您可以在单个类中组合这两个对象,然后使用 .PriorityQueue

您要么需要提供比较器,要么通过实现可比较接口来依赖自然排序


溶液

  • 创建一个具有 和 作为其成员的类。Stringint

    public class Entry {
        private String key;
        private int value;
    
        // Constructors, getters etc.
    }
    
  • 实现接口并委托比较到 。ComparableString

    public class Entry implements Comparable<Entry> {
        private String key;
        private int value;
    
        public Entry(String key, int value) {
            this.key = key;
            this.value = value;
        }
    
        // getters
    
        @Override
        public int compareTo(Entry other) {
            return this.getKey().compareTo(other.getKey());
        }
    }
    
  • 使用此类生成 。PriorityQueue

    PriorityQueue<Entry> q = new PriorityQueue<>();
    
  • 添加元素,如下所示。

    q.add(new Entry(strings.get(x), calculateStringValue(strings.get(x))));
    

希望这有帮助。


答案 2

使用 Java-8

PriorityQueue<Map.Entry<String, Integer>> queue = new PriorityQueue<>(Map.Entry.comparingByValue(Comparator.reverseOrder()));

添加新条目

queue.offer(new AbstractMap.SimpleEntry<>("A", 10));

推荐