ハッシュマップがあります。複数のキーに同じ値があります。を見つける最良の方法は何ですか
keys for repeated Values
繰り返すことなく。?
このドキュメントを読むと、機能がないように感じます。
注: キー | 値のペアは Int 型です
標準のJDKAPIでマップを反復処理せずに、値のすべてのキーを見つける方法はありません。
Guavaライブラリは、次のいずれかの方法で使用できます。
制御できないコードからマップを読み取った場合は、マップを反復処理する以外に選択肢はありません。
いずれの場合も、逆マップを作成することで複数の反復を行う問題を回避できます。これは、マルチマップに要約されますが、Javaにはそのパターンの特定のクラス定義がないため、マップを使用して作成する必要があります。およびリスト。
元のマップに新しいペアを含める必要があるたびに、リバースマップ<k,v>
にもリバースペア<v,k>
を含めます。v
キーとして(つまり、元の値)がリバースマップにまだ存在しない場合は、値(つまり、元のキー)としてのみ含まれているリストにマップしますk
。キーv
がリバースマップにすでに存在する場合は、値k
を既存のリストにプッシュするだけです。
元のマップの特定の値にどのキーがマップされているかを知る必要がある場合は、逆マップの値を照会して、キーのリストを取得します。
マップに関するJavaチュートリアルには、マップを使用したマルチマップの実装に関するセクションが含まれています。
このソリューションは、マップ作成プロセスを制御できる場合に非常に効果的です。ただし、マップが作成され、外部のメカニズムによって定期的に更新される場合、それはほとんど効果がありません。
マップの作成のみを制御でき、更新は制御できない場合は、Map
インターフェイスを公開する新しいクラスを実装できます。このクラスは、リバースマップも内部的に保持し、新しいペアが挿入/削除されたときに更新するか、通知をサポートします。マップが変更されたこととその方法をコードに通知するメカニズム。
いずれにせよ、コレクションを反復することになります。一部のライブラリでは反復が非表示になっている場合がありますが、必ず存在します。
必要なことを行う単純なメソッドを簡単に作成できます。
public static <K,V> Set<K> keysOfDupValues(Map<K,V> m) {
Set<K> res = new HashSet<K>();
Map<V,K> seen = new HashMap<V,K>();
for (Map.Entry<K,V> e : m.entrySet()) {
V v = e.getValue();
K k = e.getKey();
if (seen.containsKey(v)) {
res.add(k);
res.add(seen.get(v));
} else {
seen.put(v, k);
}
}
return res;
}
変更してみる
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ ts);
to
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ "/"+ts);
それは本当に不可能です。containsValue()
スーパークラスの method の実装java.util.AbstractMap
そのものが、値を反復処理します。
したがって、それを達成するには、値を繰り返し処理する必要があります。
の実装をcontainsValue()
見て、それを行う方法のヒントを得ることができます。