2011-09-13 13 views
3

java.util.Map.values()は、値に基づいてキー値のペアを削除する意味がない場合、返されたコレクションからエントリを削除できるのはなぜですか?これを行うコードでは、削除される値(したがってキー)がどのキーからマップされているのか分かりません。特に値が重複している場合、そのCollectionでremoveを呼び出すと、予期しないキーが削除されます。java.util.Map.values()は、返されたコレクションからエントリを削除できる理由

答えて

6

それは、私はあなたが十分に想像力豊かであることだとは思わない値

に基づいて、キーと値のペアを削除しても意味がありません。私はおそらく幅広いが使用されていないことを認めますが、それが有用である有効な場合があります。

サンプルユースケースとして、Map<Person, TelephoneNumber>contactListとなっていたとします。これでローカルにある連絡先リストをフィルタリングします。

これを達成するには、localContacts = new HashMap<>(contactList)のコピーを作成し、TelephoneNumberがローカルエリアコード以外の市外局番で始まるすべてのマッピングを削除することができます。これは、あなたがvaluesコレクションを反復処理し、値のいくつかを削除する有効な時間のようになります。

Map<Person, TelephoneNumber> contactList = getContactList(); 
Map<Person, TelephoneNumber> localContacts = new HashMap<Person, TelephoneNumber>(contactList); 

for (Iterator<TelephoneNumber> valuesIt = localContacts.values().iterator(); valuesIt.hasNext();){ 
    TelephoneNumber number = valuesIt.next(); 
    if (!number.getAreaCode().equals(myAreaCode)) { 
     valuesIt.remove(); 
    } 
} 

重複する値がある場合は特に、そのコレクションに削除呼び出すと、予期しないキービーイングにつながります除去された。

すべてののマッピングをその値で削除する場合はどうすればよいですか?

0

返されるCollectionは、特別なCollectionであり、そのセマンティクスは、それがどの値から来たものかを知るようなものです。 javadocは、返されたコレクションがサポートしている操作Collectionを示します。

+2

なぜそれが許されているのか、それはどうやって行われたのかという疑問があるようです。 – Kevin

+0

@ケビン - 良い点。私はそのニュアンスを見逃しているようです:)この質問につまずいた人は、それが適切であると感じるかもしれないので、私はこの回答をとにかく残します。 – cdeszaq

6

removeメソッドは、Collectionの一部である必要があります。それで、値を取り除くか、UnsupportedOperationExceptionを投げることを許可する選択肢があります。値を削除することが正当な理由があるので、なぜこの操作を許可しないのですか?

  • はたぶん、あなたはMapからのすべてのインスタンス を削除する指定した値があります。
  • 何らかの理由で のキーと値のペアが1つおきにトリムされることがあります。
  • たぶん、あなたは、占有カウントにホテルからマップ 部屋番号を持っていて、中に滞在するために誰かのために部屋を見つける するために占有カウントが1より大きい マップからすべてを削除したい。
  • あなたは より密接に考えてみれば...、
  • 要するに

...このようなたくさんのより多くの例があります。これは有用であり、それは誰にも害はありません実装する可能性がある状況の多くが誰ですかそれを使用しないので、なぜですか?

0

キーに基づいて値を削除することは非常によくあると思います。他の答えは例を示しています。それで、ある価値を取り除きたいのであれば、なぜその中の特定の一つの鍵だけを削除したいのですか?たとえ削除しても、削除したいキーがあるかどうかを知っていなければならず、キーで削除する必要があります。

関連する問題