2016-07-09 11 views
-2

私はマップ>である "stateCityMap"というHashMapを持っています。 KeysはStates、すなわちGoa、Keralaなどであり、値は都市、すなわちPanjim、Margaoなどです。特定の都市がHashMap(例:Margao)に存在するかどうかを確認し、その値の対応するキーを結果として返します..しかし、毎回私は以下のコードを実行しました。他の部分を実行します(都市がHashMApに存在しないとき)。 市: - 私はこの関数に渡す都市の名前があるHashMapの指定された値からキーを取得

コード:

public String getState(Map<String, List<String>> stateCityMap, String city) throws CityNotFoundException { 


    HashMap<String, List<String>> g = new HashMap<String, List<String>>(stateCityMap); 

    if(g.containsValue(city)){ 

     System.out.println("State:- " +g.get(city)); 

    } 
    else { 
     throw new CityNotFoundException("City Not Found"); 
     } 

    return null; 
} 

なぜそれはそれをやっていますか?なぜ私は間違った結果を得ていますか?

+0

このデータ構造は、BiMultiMapまたはMultiBiMapのようなものです。それは少しエキゾチックです。 –

+1

* O(N)*テクニックではなく* O(1)*時間に逆関数を提供するには、マップを先頭に戻すか、2つのマップを使用する必要があります。 – EJP

+0

O(N)より悪いです。 O(市町村)+ O(市町村)。 –

答えて

2

それは効率的ではないのですが、あなたはマップ内の各リストをスキャンする必要があります:マップが指定された値に1つ以上のキーをマッピングしている場合

public String getState(Map<String, List<String>> stateCityMap, String city) throws CityNotFoundException { 
    for (Map.Entry<String, List<String>> entry : stateCityMap.entrySet()) { 
     if (entry.getValue().contains(city)) { 
      return entry.getKey(); 
     } 
    } 

    throw new CityNotFoundException("City Not Found"); 
} 
+0

Canlangiterable <---エラーの配列またはインスタンスに対してのみ反復可能 –

+1

修正済み。しかし、実際にはタイプミスであり、あなた自身でそれを調べることができます。 –

1

のcontainsValueメソッドはtrueを返します。

値の型はListですが、Stringを渡してcontainsValueメソッドを呼び出しています。したがって、常にfalseを返します。

あなたの値のタイプはListなので、すべてのキーとすべての値を繰り返して、都市がリストに存在するかどうかを調べます。

2つのマップを維持する方が良いでしょう。両方のマップが常に正しく更新(挿入、削除、更新)されるようにすることが課題です。

希望に役立ちます。

関連する問題