这可能是一个愚蠢的问题,但我如何在java中返回Map.Entry对?
给出一个方法:
public Map.Value<K,V> next(){
return ???
}
如何构建并返回地图值?这是我为Hash Map实现的迭代器内部。获取我想要返回的值没有问题,但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();
}
};
}
}
我在那里有抽象的方法,但我不确定如何实现它们。再次感谢您的帮助
答案 0 :(得分:3)
做了一些研究,如果你需要返回一个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);
}
}
这显然没有做任何事情,但它将返回值注册为有效,这是原始问题
答案 1 :(得分:1)
Map.Entry的每个实现都是package-private,因此无法在其包外创建。您应该创建自己的实现java.util.Map.Entry的类并将其返回。像你的匿名实现,但提取到非匿名类。
添加一个带有键和值并实现方法的构造函数,它应该是直截了当的。
答案 2 :(得分:0)
在这种情况下,我也需要返回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:如果我错了,请纠正我。我乐意去学。谢谢:)