【问题标题】:How to know if a key exists in inner map using java?如何使用java知道内部映射中是否存在键?
【发布时间】:2022-01-12 14:14:44
【问题描述】:

在下面的地图中,我如何知道 key3 是否存在而无需通过暴力 for 循环并检查每个内部地图。 鉴于所有键都是唯一的,我们是否有任何库函数可以做到这一点?

"map": {
        "key1": "value1",
        "innerMap": {
          "key2": "value2",
          "innerMap2": {
            "key3": "value3"
          }
        }
      }

【问题讨论】:

  • 如果不到处寻找,就无法检查 key3 的不存在。如果这听起来太粗暴,那么您可以使用 .contains("\"key3\":")' 检查此 json 的字符串表示形式
  • 但请注意,对 JSON(或其他任何内容)进行字符串匹配可能会很脆弱。而且,将嵌套的映射结构转换为字符串,以便您可以使用 contains 进行搜索,这将比对映射树的“蛮力”搜索更昂贵。
  • @StephenC 非常正确,除非json字符串是原始输入,这意味着没有必要将任何东西转换为json。
  • 它是一个 HashMap。根据反对票,我想我会开始处理 for 循环 XD。

标签: java dictionary


【解决方案1】:

假设您的图片描述了Map,那么“蛮力”树遍历是您的最佳选择。

没有用于搜索嵌套地图的标准 Java SE API。

@f1sh 提到了进行字符串搜索的可能性……假设地图实际上是 JSON。有一些重要的警告:

  1. 搜索 JSON 字符串(或调用 Map.toString() 的结果)的字符串可能很脆弱。例如,如果地图中的 value 包含该搜索字符串,.contains("\"key3\":") 将给出错误匹配。

  2. Map 呈现为 JSON(或其他)以进行字符串搜索将比进行搜索更昂贵。

  3. String.contains 搜索可能需要查看序列化中的每个字符。这就像树遍历一样“蛮力”。


我能想到的唯一不是“蛮力”的选择是创建一个辅助数据结构;例如HashSet 映射树中的所有(唯一)键。创建后,可以在 O(1) 中查询该集合 ...但创建它是 O(N) 其中 N 是树中(非不同!)键的数量。


最后,映射树遍历可以是一种递归方法,而不是(只是)一堆 for 循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2012-06-24
    • 2012-01-04
    相关资源
    最近更新 更多