Java - 如何通过键获取存储在HashMap中的键对象(或条目)?

标签 java dictionary key

我想获取可用于查询 map 的每个键的“规范”键对象。请参阅此处:

Map<UUID, String> map = new HashMap();
UUID a = new UUID("ABC...");
map.put(a, "Tu nejde o zamykání.");

UUID b = new UUID("ABC...");
String string = map.get(b); // This gives that string.

// This is what I am looking for:
UUID againA = map.getEntry(b).key();
boolean thisIsTrue = a == againA;

HashMap 使用 equals(),这对于多个唯一对象是相同的。所以我想从 map 中获取实际的键,无论使用什么对象来查询 map ,它总是相同的。

有没有办法从 map 中获取实际的关键对象?我在界面中没有看到任何内容,但也许是我忽略了一些巧妙的技巧?

(迭代所有条目或键不算在内。)

最佳答案

Is there a way to get the actual key object from the map?

好的,所以我将对你的意思做出一些假设。毕竟,你说你的问题不需要澄清,所以我能看到的明显含义一定是正确的。正确的? :-)

答案是否定的。没有办法。

示例场景(不可编译!)

UUID uuid = UUID.fromString("xxxx-yyy-zzz");
UUID uuid2 = UUID.fromString("xxxx-yyy-zzz");  // same string
println(uuid == uuid2);  // prints false
println(uuid.equals(true));  // prints true

Map<UUID, String> map = new ...
map.put(uuid, "fred");
println(map.get(uuid)); // prints fred
println(map.get(uuid2)); // prints fred (because uuid.equals(uuid2) is true)

...但是,Map API 不提供查找实际 key 的方法(在上面的示例中,它是uuid )在 map 中除了迭代键或条目集之外。而且我不知道任何现有的 Map 类(标准或第 3 方)确实提供了此功能1

但是,您可以实现自己的Map类,并使用一个附加方法来返回实际的键对象。尽管您需要编写、测试、维护更多代码等,但没有任何技术原因导致您不能这样做。

<小时/>

但我想补充一点,我同意吉姆·加里森的观点。如果您有一个场景,其中有 UUID 对象(具有按值相等语义)并且您还想通过标识语义实现相等,那么您的应用程序的设计可能有问题。正确的方法是更改​​ UUID.fromString(...) 实现,以始终为相同的输入字符串返回相同的 UUID 对象。

<小时/>

1 - 这并不是说这样的 map 实现不存在。但如果确实如此,如果您足够努力,应该能够找到它。请注意,要求我们查找或推荐图书馆的问题是题外话!

关于Java - 如何通过键获取存储在HashMap中的键对象(或条目)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47481283/

相关文章:

python - 检查字典中键内的键

javascript - 挑选一个 JSON 对象来创建多个数组

ios - 如何创建具有多个键的 NSDictionary?

ios - Plist 字典键

java - 如何配置缓存 (guava)

java - 查询索引数据库的java代码与查询未索引数据库的java代码相同吗?

java - 在rest application jax-rs, maven project中添加外部文件(.css, .js, ecc)

python - 如何删除值为 0 的键,同时扫描字典以搜索值为 0 的键?

javascript - 查找 JavaScript 数组中最大值的键

java - Android使用target时的Picasso回调