【问题标题】:Return Map.Entry in Java在 Java 中返回 Map.Entry
【发布时间】:2014-10-27 04:12:53
【问题描述】:

这可能是一个愚蠢的问题,但是如何在 java 中返回 Map.Entry 对?

给定一个类似的方法:

public Map.Value<K,V> next(){

  return ???
}

如何构建和返回地图值?这是我正在为哈希映射实现的迭代器内部。获取我想要返回的值没有问题,但是 java 不允许我实例化 Map.Entry 对象,除非我实现所有抽象方法,即使那样它也不起作用。我是否需要为 Map.Entry 构建一个构造函数,它可以传递我要提取的 K、V 值?

非常感谢任何帮助/指导

更新

我正在尝试为自定义 HashMap 实现迭代器,并且需要实现 next() 方法 - 我的代码结构是:

@Override
 public Iterator<Map.Entry<K, V>> iterator() {
     return new Iterator<Map.Entry<K, V>>(){


        public boolean hasNext(){
                return false;
         }

         public Map.Entry<K,V> next(){
             Map.Entry<K, V> retVal = new Map.Entry<K, V>() {

                 public Map.Entry<K, V>(K key, V val){

                 }
                @Override
                public K getKey() {
                    // TODO Auto-generated method stub
                    return null;
                }

                @Override
                public V getValue() {
                    // TODO Auto-generated method stub
                    return null;
                }

                @Override
                public V setValue(V value) {
                    // TODO Auto-generated method stub
                    return null;
                }
            };


             }

             return null;
         }

         public void remove(){
             throw new UnsupportedOperationException();
         }


     };
 }

}

我有抽象方法,但我不确定我应该如何实现它们。再次感谢您的帮助

【问题讨论】:

  • 你自己说的,你必须实现 Map.Entry 接口的所有方法。没有您的代码,我们无能为力。
  • 请详细说明您到底想做什么。
  • 我正在尝试为多值哈希映射实现迭代器,但我想我的问题更笼统 - 如何从映射中返回键值对...或我是否以错误的方式实现迭代器?
  • 您可能会发现查看HashMap implementation 很有用。 Map 类本身,假设是一个自定义实现,应该已经有某种形式的条目集,这个迭代器将要对其进行迭代。

标签: java hashmap hashset


【解决方案1】:

做了一些研究,如果您需要返回 Map.Entry 值并且想要在不实现 Map.Entry 类和方法的情况下这样做,您可以通过返回 AbstractMap.SimpleEntry 来实现。

我设置了一些虚拟代码来显示这个:

import java.util.HashMap;
import java.util.Map;


public class MapReturn<K,V> extends HashMap<K,V>{

    public static void main (String [] args){

    }

    public Map.Entry<K,V> returnMapValue(K k, V v){

        return new java.util.AbstractMap.SimpleEntry<K,V>(k,v);
    }

}

这显然没有做任何事情,但是它将返回值注册为有效,这是最初的问题

【讨论】:

    【解决方案2】:

    Map.Entry 的每个实现都是包私有的,因此不能在其包之外创建。您应该创建自己的实现 java.util.Map.Entry 的类并返回它。类似于您的匿名实现,但提取到非匿名类。

    添加一个构造函数,它接受键和值并实现方法,它应该很简单。

    【讨论】:

      【解决方案3】:

      我也遇到过需要返回 Map.Entry 的情况。 在这里,我正在迭代一个地图在我的例子中,我需要键和值。

      我想发布这个,因为我有同样的情况。但是我最初尝试了这个并且它对我有用,后来,我想用 internet/StackOverflow 上的代码来验证我的代码。因此,我想发布这个作为对这个场景/问题的帮助,因为我知道这是一个迟到的回复,但是一个不同的、经过实验和测试的回复。

      // This is the method which dealt a static Map iteration.
      
      Entry<String, Integer> calculateDaysOfNextMonth(String month, boolean isGivenYearLeap) {
      Entry<String, Integer> resultEntry = null;
      
          // monthsMap is a map initialized in a static block.
          if (monthsMap.containsKey(givenMonth)) {
              for (Entry<String, Integer> entry : monthsMap.entrySet()) {
                 if(someImportantConditionHere) {
                      resultEntry = entry;
                      resultEntry.setValue(resultEntry.getValue() + 1);
                 } else {
                      resultEntry = entry;
                 }
              }
          }
      
      return resultEntry;
      }
      
      // The method invocation, where I collected "Entry<String, Integer> entry" as a result
      public static void main(String args[]) {
         System.out.println("Next month contains: "+calculateDaysOfNextMonth("JAN", true)+" days !");
      }
      

      PS:如果我错了,请纠正我。我乐意去学。谢谢:)

      【讨论】:

        猜你喜欢
        • 2011-11-16
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-02
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多