【问题标题】:List of entries, how to add a new Entry?条目列表,如何添加新条目?
【发布时间】:2011-09-01 13:12:42
【问题描述】:

在 Java 中,我正在实现这个:

List<Entry<String, Integer>> listObjects = new ArrayList<Entry<String, Integer>>();

但是如何添加新条目?

因为它不适用于:listObjects.add(new Entry&lt;"abc", 1&gt;());

提前致谢。

【问题讨论】:

  • 所有问题都应该有预期的行为实际行为(在你的情况下产生的错误)。什么是 javac/Eclipse/NetBeans(或 JRE,如果它是运行时的东西)说实际问题是什么?
  • 你能给出一个“简洁”的答案吗?
  • “不起作用”究竟是什么意思?
  • 我无法创建新的 Entry 对象!
  • 对于任何有相同问题的人,请务必检查this answerHow to create a new Entry (key, value) 问题。

标签: java


【解决方案1】:

我知道这是一个相当老的线程,但您可以按以下方式进行:

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

这可能会帮助像我这样最近尝试这样做的人!

希望对你有帮助:-)

【讨论】:

    【解决方案2】:

    你的意思是Map.Entry?那是一个接口(所以没有实现类就无法实例化,可以learn about interfaces in the Java Tutorial)。 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&lt;String,Integer&gt;("abc", 1))

    但这在地图上下文之外并没有真正意义。

    【讨论】:

    • 泛型滥用是如此明显,我没想到 :) 删除我的答案
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • Guava 不适用于空元素。并非在所有情况下都有用。
      【解决方案5】:

      也许是listObjects.add(new Entry&lt;String, Integer&gt;("abc", 1));?泛型指定类型(StringInteger),而不是值(abc1)。

      编辑 - 请注意,后来添加了 Entry 实际上是 Map.Entry,因此您需要创建一个稍后实例化的 Map.Entry 的实现,与选择的完全相同答案解释。

      【讨论】:

      • listObjects.add(new Entry("abc", 1));也确实有效。谢谢!
      • @stifin 你是对的,但是最初的问题没有提到Map.Entry;一旦已经给出了答案,OP稍后会澄清它;当然在这种情况下你必须实现Map.Entry 并实例化它
      猜你喜欢
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2018-05-22
      • 2012-03-31
      • 1970-01-01
      相关资源
      最近更新 更多