2017-06-17 5 views
1

まず、AbstractMapを拡張したクラスがあります。JavaでMapEntryを操作するには?

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

クラスは、List型の二つの容器を持っています

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

クラスは、同様にいくつかのmethosを持っています。 Vキーのような引数を取り、リストのキーに入れて置く方法:

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の取得がそうでなければ、メソッドteturnヌル、リスト値から値を返します。

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

「動作しません」と定義します。 –

+2

「うまくいかない」とはどういう意味ですか?エラーとは何ですか? –

+0

'MapEntry'はクラスではありません。 –

答えて

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はクラスではありません。コードを更新してください。

+0

ありがとう!私は私のエラーを発見した:) –

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を1つのメソッド内でのみ使用する予定がある場合にのみ適しています。さもなければ、同様の機能を持つ名前付きクラスを使うほうが良いでしょう。

+0

ありがとう! MapEntryは、Map.Entry を実装するクラスです。 –