1

私はHashMapデータを得ました:

Map<CharSequence, MyObject> dataMap = GET_FROM_SOME_WHERE

値が「company.name」dataMapCharSequenceタイプのキーが にあります

しかし、次のコードはfalseを返します。

String field = "company.name";
dataMap.containsKey(field); //This return me false

HashMapStringのキーがCharSequence. それが私に偽を返す理由です。

私の推測が正しければ、どうすればそれを取り除くことができますか? 上記のコードが true を返す必要があります。キー「company.name」がそのマップデータにキーとしてあると確信しています。

4

6 に答える 6

1

なぜ入れないのか

CharSequence field = "company.name";
于 2013-11-01T10:11:22.553 に答える
1

Collection の使用は、非常に難しい場合があります。

Map.containsKey() が機能する方法は、「キー」オブジェクトの .equals() メソッドを呼び出してオブジェクトの等価性を調べることです。そのため、CharSequence も実装しているStringBufferを介してマップに物を配置し、マップにキーが存在するかどうかを尋ねようとしても、キーとしてStringを提供すると、コレクション フレームワークに実際に挑戦することになります。これは、次の例で示すことができます。

Map<CharSequence, Integer> dataMap = new HashMap<CharSequence, Integer>();
StringBuffer sb = new StringBuffer();
sb.append("company.name");
CharSequence cs = sb;
dataMap.put(cs, 123);

String k = "company.name";
// Below prints a 'false'
System.out.println(dataMap.containsKey(k));

したがって、私のアドバイスは、(Map だけでなく) コレクション内のキー エントリと常に同じタイプのオブジェクトを使用することです。この場合、おそらくマップを次のように定義することもできます

Map<String, MyObject>
于 2013-11-01T10:31:42.170 に答える
1

これが機能するためにはCharSequence、マップ内の の実装は、等しいかどうかをチェックする際に s を認識Stringし、 と同一のハッシュ コードを生成し、等しいかどうかを比較して同じ値を持つ文字列にString戻る必要があります (つまり、両側から機能する必要があります)。の実装が実際にでない限り、これは不可能です。trueequalsCharSequenceString

これに対処する 1 つの方法は、 を に変換するMap<CharSequence,MyObject>ことMap<String,MyObject>です。次のように、元のマップのエントリ セットを反復処理し、データをStringキーとして使用するコピーに入れます。

Map<String,MyObject> copy = new HashMap<String,MyObject>();
for (Map.Entry<CharSequence,MyObject> e : dataMap.entrySet()) {
    copy.put(e.getKey().toString(), e.getValue());
}
于 2013-11-01T10:18:12.960 に答える