如何在Java中使用MapEntry?

时间:2017-06-17 10:27:28

标签: java

首先,我有一个扩展AbstractMap的类。

public class ShowMap <K, V> extends AbstractMap <K, V>

Class有两个List类型的容器:

private List <K> keys = new ArrayList <K> ();
private List <V> values = new ArrayList <V> ();

班级也有几种方法。 方法V put采用类似键的参数并将其放入List键:

public V put (K key, V value){
    V oldValue = this.get(key);
    if (!keys.contains(key)){
        keys.add(key);
        values.add(value);
    }
    else{
        values.set(keys.indexOf(key), value);
    }

    return oldValue;
}

方法V get从List值返回一个值,否则方法teturn null:

public V get (Object obje){
    if (!keys.contains(obje))
        return null;
    return values.get(keys.indexOf(obje));
}

以下方法形成一组MapEntry,但它不起作用:

public Set<java.util.Map.Entry<K, V>> entrySet() {

    Set <Map.Entry<K, V>> sets = new HashSet <Map.Entry<K, V>> ();
    Iterator<K> ki = keys.iterator();
     Iterator<V> vi = values.iterator();

     while (ki.hasNext()){
        sets.add(new MapEntry <K, V> (ki.next(), vi.next())); // This line should to work, however It doesn't work...
     }
    return sets;
}

当然主要方法是:

public static void main (String [] args){
    ShowMap <String, String> SM = new ShowMap <String, String> ();
    SM.putAll(Countries.FMap.capitals(10));
    System.out.println(SM);
    System.out.println(SM.get("Moscow"));
    System.out.println(SM.entrySet());
}

非常感谢:)

2 个答案:

答案 0 :(得分:1)

public Set<java.util.Map.Entry<K, V>> entrySet() {
        Set <Map.Entry<K, V>> sets = new HashSet <Map.Entry<K, V>> ();
        Iterator<K> ki = keys.iterator();
         Iterator<V> vi = values.iterator();

         while (ki.hasNext()){
            sets.add(new MapEntry <K, V> (ki.next(), vi.next())); // This line should to work, however It doesn't work...
         }
        return sets;
    }

在这里,您将返回一组Map.Entry而不是MapEntry。而且,MapEntry不是一个类。请更新代码。

答案 1 :(得分:1)

Map.Entry<K,V>是一个界面。您可以为其实例化创建命名类,或使用匿名类,如下所示:

public Set<Map.Entry<K,V>> entrySet() {
    Set<Map.Entry<K,V>> sets = new HashSet<Map.Entry<K,V>> ();
    Iterator<K> ki = keys.iterator();
    Iterator<V> vi = values.iterator();
    while (ki.hasNext()){
        final K key = ki.next();
        final V val = vi.next();
        sets.add(new Map.Entry<K,V>() {
            public boolean equals(Object obj) {
                if (!(obj is Map.Entry)) return false;
                Map.Entry other = (Map.Entry)obj;
                return key.equals(other.getKey()) && val.equals(other.getValue());
            }
            public int hashCode() {
                return 31*key.hashCode()+val.hashCode();
            }
            public K getKey() { return key; }
            public V getValue() { return val; }
            public void setValue(V v) { throw new UnsupportedOperationException(); }
        });
    }
    return sets;
}

匿名类提供了一个简单的接口实现。仅当您计划仅在单个方法内使用Map.Entry时,此选项才适用。否则,最好使用具有类似功能的命名类。