条目列表,如何添加新条目?

6
在Java中,我正在实现以下内容:
List<Entry<String, Integer>> listObjects = new ArrayList<Entry<String, Integer>>();

但是我该如何添加新的条目?

因为这个方法不起作用:listObjects.add(new Entry<"abc", 1>());

提前感谢。


1
所有问题都应该有预期行为和实际行为(在您的情况下生成的错误)。javac / Eclipse / NetBeans(或JRE,如果它是运行时问题)到底在说什么是实际问题? - paxdiablo
你能给一个“简明扼要”的答案吗? - olidev
“不起作用”实际上是什么意思? - kostja
我无法创建新的Entry对象! - olidev
1
如果有相同问题的人,请务必查看如何创建新条目(键,值)问题的此答案 - Bloke
5个回答

13

我知道这是一个比较旧的主题,但你可以按照以下方法实现:

listObjects.add(new java.util.AbstractMap.SimpleEntry<String, Integer>("abc", 1));

这可能会帮助像我这样最近试图做到这一点的人!

希望它有所帮助 :-)


5

你是指Map.Entry吗?那是一个接口(所以你不能实例化它,除非有一个实现类,你可以在Java教程中了解接口)。Entry 实例通常只由 Map 实现创建,并且只通过 Map.entrySet() 公开。

当然,既然它是一个接口,你也可以添加自己的实现,就像这样:

public class MyEntry<K, V> implements Entry<K, V> {
    private final K key;
    private V value;
    public MyEntry(final K key) {
        this.key = key;
    }
    public MyEntry(final K key, final V value) {
        this.key = key;
        this.value = value;
    }
    public K getKey() {
        return key;
    }
    public V getValue() {
        return value;
    }
    public V setValue(final V value) {
        final V oldValue = this.value;
        this.value = value;
        return oldValue;
    }
}

这样你就可以执行 listObjects.add(new MyEntry<String,Integer>("abc", 1))

但在 map 上下文之外,这并没有什么意义。


泛型的误用非常明显,我没有想到:) 删除我的答案。 - kostja

4

Entry是一个参数化类,你需要使用构造函数创建Entry的实例(通常的方式)。

即使不知道Entry的具体实现,以下方法也可以工作(至少它展示了通常的做法):

// create a list
List<Entry<String, Integer>> listObjects = 
               new ArrayList<Entry<String, Integer>>()

// create an instance of Entry
Entry<String, Integer> entry = new Entry<String, Integer>("abc", 1);

// add the instance of Entry to the list
listObjects.add(entry);

使用Map.Entry有所不同(OP刚才提到,Entry实际上是Map.Entry)。我们无法创建Map.Entry实例,通常是从现有的映射中获取它们:

Map<String, Integer> map = getMapFromSomewhere();
List<Map.Entry<String, Integer>> listObjects = 
               new ArrayList<Map.Entry<String, Integer>>();

for (Map.Entry<String, Integer> entry:map.entrySet())
    listObjects.add(entry);

2

使用现成的Entry实现的一种方法是使用Guava的Immutable Entry。像这样:listObjects.add(Maps.immutableEntry("abc",1));


Guava 不支持 null 元素。它并不在所有情况下都有用。 - august0490

0

或许可以使用 listObjects.add(new Entry<String, Integer>("abc", 1));?泛型指定了类型 (String, Integer),而不是值 (abc, 1)。

编辑 - 注意后来补充说明,Entry 其实是 Map.Entry,所以您需要创建一个 Map.Entry 的实现,正如选定答案所解释的那样。


listObjects.add(new Entry<String, Integer>("abc", 1)); 也可以工作。谢谢! - olidev
@stifin 你说得对,但是原始问题并没有提到 Map.Entry;OP稍后澄清了这一点,当答案已经给出时;当然,在这种情况下,你必须实现 Map.Entry 并实例化它。 - Miki

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