【问题标题】:Access to the key-value pair of a Map with one element in Java在 Java 中使用一个元素访问 Map 的键值对
【发布时间】:2014-10-15 23:20:42
【问题描述】:

我的一个方法返回一个Map<A,B>。在某些明确标识的情况下,映射仅包含一个键值对,实际上只是两个对象的包装器。

是否有一种高效/优雅/清晰的方式来访问键和值?迭代单元素条目集似乎有点过头了。我正在寻找能够降低维持这一点的人所需的脑力的东西,大致如下:

(...)
// Only one result.
else {
    A leKey = map.getKey(whicheverYouWantThereIsOnlyOne); // Is there something like this?
    B leValue = map.get(leKey); // This actually exists. Any Daft Punk reference was non-intentional.
}

编辑:我最终选择了下面的@akoskm 解决方案。最后,在没有迭代的情况下唯一令人满意的方法是使用TreeMap,而开销使这种做法变得不合理。

事实证明,并不总是有灵丹妙药,尤其是用它杀死一只很小的兔子。

【问题讨论】:

  • 这对你来说是不是有点矫枉过正:final Map.Entry<Integer, String> singleEntry = (new HashMap<Integer, String>()).entrySet().iterator().next();?
  • Map 的正常用例是多个 key=value。你的是一个例外,需要一些看起来太多的代码。
  • 不,因为它不是 map 合同的一部分:1) map 可以为多个键保存相同的值,没有理由让它有任何例外 2) 在内部它无论如何都必须迭代所有值,再次没有理由保持反向索引
  • 如果您的地图只有一个键(并且总是这样),那么存储数据可能不是更好的结构
  • 顺便检查一下post吗??

标签: java map readability


【解决方案1】:

有一个名为keySet() 的方法来获取密钥集。阅读此thread

else {
    A leKey=map.keySet().iterator().next();

    B leValue; = map.get(leKey); // This actually exists. Any Daft Punk reference was non-intentional.
}

【讨论】:

  • 当地图只有一个键时为什么要迭代?
  • 没必要。否则,您需要创建一个变量来将 Keys 列表存储到数组中并访问它。如您所知,每个 Map 有一个键。 Map 以 Set 形式返回 Key
  • 你迭代并指责迭代是在说“迭代没有必要”?
  • 如果您不使用每个循环,则需要创建一个变量来存储 Keys 列表,将它们转换为数组并访问它(一种方法)。
  • 不,您可以简单地访问条目集并从中获取唯一的映射条目,而无需 for 循环和增加代码复杂性的变量。
【解决方案2】:

您可以使用TreeMapConcurrentSkipListMap

TreeMap<String, String> myMap = new TreeMap<String, String>();
String firstKey   = myMap.firstEntry().getKey();
String firstValue = myMap.firstEntry().getValue();

另一种使用方式:

String firstKey   = myMap.firstKey();
String firstValue = myMap.get(myMap.firstKey());

这可以作为替代解决方案。

【讨论】:

    【解决方案3】:

    如果您同时需要键/值,请尝试以下操作:

    Entry<Long, AccessPermission> onlyEntry = map.entrySet().iterator().next();
    onlyEntry.getKey();
    onlyEntry.getValue();
    

    【讨论】:

    • 遍历单元素条目集似乎有点过头了。
    • OP 要求一种高效/优雅/清晰的方式。我认为这至少满足其中两个。当然,您总是可以发明自己的轮子并在几行代码中编写一些闪亮的逻辑,这并不一定会降低维护它的人所需的脑力
    • 我认为如果 OP 没有说这将是第一个发布的答案迭代单元素条目集似乎有点过头了。。答案是正确的,但不是 OP 想要的。 (顺便说一句,我没有投反对票)
    • 我迫不及待地想看到不迭代单元素集的解决方案。
    • 谢谢你,@TheLostMind,你试图坚持我的要求——但我想我想多了。这个问题可能会成为“想想维护者”和 KISS 原则的一个例子。编写“聪明”的代码对自我来说是令人满意的,但有时会被误导。谢谢大家的建议。
    猜你喜欢
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    相关资源
    最近更新 更多