如何向优先队列中添加单个地图条目

3

目前,我需要添加整个地图,如最后一行所示。

PriorityQueue<Map.Entry<String, Integer>> sortedCells = new PriorityQueue<Map.Entry<String, Integer>>(3, new mem());
    Map<String,Integer> pn = new HashMap<String,Integer>();
    pn.put("hello", 1);
    pn.put("bye", 3);
    pn.put("goodbye", 8);
    sortedCells.addAll(pn.entrySet());

如果我只想添加这个怎么办?
("word" 5)

如果我这样做

sortedCells.add("word",5)

我遇到了参数错误。

如何添加单个元素?

1个回答

4

你应该添加一个Map.Entry对象而不仅仅是("word", 5),因为你的优先队列的泛型类型是 Map.Entry<String, Integer>。在这种情况下,你可能需要创建自己的Map.Entry类:

final class MyEntry implements Map.Entry<String, Integer> {
    private final String key;
    private Integer value;

    public MyEntry(String key, Integer value) {
        this.key = key;
        this.value = value;
    }

    @Override
    public String getKey() {
        return key;
    }

    @Override
    public Integer getValue() {
        return value;
    }

    @Override
    public Integer setValue(Integer value) {
        Integer old = this.value;
        this.value = value;
        return old;
    }
}

在你的代码中,现在可以调用:

sortedCells.add(new MyEntry("word",5));

如果您不想实现自己的条目(entry),可以使用AbstractMap.SimpleEntry: AbstractMap.SimpleEntry
sortedCells.add(new AbstractMap.SimpleEntry<String, Integer>("word",5));

虽然这并不是一个严重的问题,但如果我打印sortedcells,它会显示:[hello=1, bye=3, test.MyEntry@a32b, goodbye=8],我该如何让test.MyEntry@a32b出现为word=5?此外,将MyEntry类放在单独的Java文件中是否更好,还是可以放在同一个文件中? - user3809938
我修改了问题,你可以使用SimpleEntry代替你自己的实现(我在写原始问题后找到了它)。 SimpleEntry实现了toString()并且你将获得相同的结果。或者在你的MyEntry中实现toString()。如果这是一个重复出现的用例,并且你想要拥有自己的结构,我会使用MyEntry(具有不同的描述性名称)。如果像你所提供的那样简单,我会使用SimpleEntry - Avi
是的,如果在myEntry中实现了toString函数,它将导致所需的输出。 - user3809938

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接