1

課題で何かを機能させるために立ち往生しています。がHashMap<Integer, ArrayList<Object>>呼び出さsharedLocksれ、HashMapの任意のArrayListで特定の値が見つかるかどうかを確認したいと思います。

次のコードはObject[]にキャストできないため、明らかに機能しませんArrayList[]が、これは私が必要とする一般的な機能のデモンストレーションです。

ArrayList[] values = (ArrayList[]) sharedLocks.values().toArray();
boolean valueExists = false;
for (int i = 0; i < values.length; i++) {
    if (values[i].contains(accessedObject)) {
        valueExists = true;
    }
}

HashMap内のすべてのArrayListで特定の値を確認する方法はありますか?この場合、HashMapsのvaluesメソッドを使用する方法がわかりません。

どんな助けでも大歓迎です。

4

7 に答える 7

2

HashMap.values()を返しますCollection。コレクションを配列(またはリスト)に変換しなくても、コレクションを反復処理できます。

for (ArrayList<Object> value : sharedLocks.values()) {
...
}
于 2012-05-15T14:31:14.590 に答える
1

HashMapは少し特別で、実際に通過するインデックスがまったくありません...

やりたいことは、最初にHashMapをコレクションに変換してから、イテレーターを使用してコレクションを反復処理することです。

HashMapでArrayListを取得するたびに、arrayList内のすべての要素を循環し、見つかった場合はジャンプします:)

于 2012-05-15T14:27:23.977 に答える
0

toArray引数として配列をとるメソッドを使用します。

これは、指定した配列を使用してデータを入力し、型変換を維持するため、型キャストする必要はありません。<Object>さらに、定義にジェネリックを保持する必要があります。

ArrayList<Object>[] values =
     sharedLocks.values().toArray(new ArrayList<Object>[sharedLocks.size()]);

考慮すべきもう1つのことは、複数のスレッドがこれを変更できるかどうかですHashMap。この場合、このコード行をに同期し、HashMapすべての変更も同期されていることを確認する必要があります。.size()これにより、他のスレッドが呼び出しと呼び出しの間の内容を変更しないようになり.toArray()ます。これは可能です。

于 2012-05-15T14:27:10.717 に答える
0

配列は必要ありません:

boolean valueExists = false;
for (ArrayList<Object> value : sharedLocks.values()) {
    if (value.contains(accessedObject)) {
        valueExists = true;
        break;
    }
}
于 2012-05-15T14:27:23.657 に答える
0

マップ内のすべての値を繰り返し処理してみませんか。

for (ArrayList<Object> list : sharedLocks) {
  if (list.contains(accessedObject)) {
    // ...
  }
}
于 2012-05-15T14:28:23.277 に答える
0

ここに、ハッシュマップを反復処理する例へのリンクがあります。これを使用して各配列リストを引き出し、次にこれを拡張して、配列リストの各要素で指定されたエントリを検索します。

http://www.java-examples.com/iterate-through-values-java-hashmap-example

于 2012-05-15T14:29:01.920 に答える
0

ネストされたforeachループを使用する必要があります。

foreach(every element in the hashmap) {
 foreach(every element in arraylist) {
   // do comparision
 }
}

foreachループとkeyExists()呼び出しまたはその中の何かで逃げることができます。APIを頭から思い出せません。

于 2012-05-15T14:30:18.663 に答える