【问题标题】:equivalent of C# dictionary method "TryGetValue()" in Java map相当于 Java 映射中的 C# 字典方法“TryGetValue()”
【发布时间】:2021-10-30 11:16:00
【问题描述】:

我正在将一个项目从 c# 迁移到 java,但 TryGetValue() 方法有问题!

这里是c#代码:

private static void _AddBadQualityChar (Dictionary<string,List<string>> badQualityChars, string charString, string badQualityChar)
        {
            List<string>        _badQualityChars;

            if (!badQualityChars.TryGetValue (charString, out _badQualityChars))
            {
                _badQualityChars = new List<string> ();
                badQualityChars [charString] = _badQualityChars;
            }

            _badQualityChars.Add (badQualityChar);
        }

我不知道 java map 中 TryGetValue() 方法的等价物是什么,我只能找到不返回 Boolean 的 get() 方法!如何用 Java 编写这个函数?

【问题讨论】:

  • 你看过地图类文档吗?我用 2 分钟的谷歌搜索找到了这个:docs.oracle.com/javase/8/docs/api/java/util/…
  • @SelmanGenç 这如何让您区分不存在的键与存在的键值是您作为默认值提供的值?
  • 您可以将getMap 区别开来,但您无法区分包含映射到null 的键的Map 和根本没有映射的Map。由于 Java 没有“输出参数”,因此没有直接等价于上述内容。你能做的最好的就是containsKey,然后是get——很遗憾,这是Map中的两次查找。因此,您需要回答的问题是,在您的用例中,您是否关心映射不存在和映射到null 之间的区别。
  • 如果您似乎没有先进行研究,这里的人们倾向于对问题投反对票。对于这样的问题,请注意您阅读过哪些文档或其他 SO 帖子,以及为什么您在那里找到的答案与您的问题不相关。
  • @SelmanGenç 假设 null 或空字符串在映射中不是有效值。在某些情况下它一个有效值。

标签: java dictionary hashmap


【解决方案1】:

对于 Java Map,等效的方法调用是 Map.containsKey(key),如下所示: https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#containsKey-java.lang.Object-

【讨论】:

  • 不直接等同于 C# 有 out 参数。您需要拨打containsKey,然后拨打get
  • 同意,我只是假设他正在寻找从地图中获取布尔值的方法,但是是的,像 C# 版本一样进行整个调用需要两者。
【解决方案2】:

在没有学习基本知识的情况下,不要试图在语言之间盲目地复制和粘贴代码。在 Java 中,不要克隆代码,而是这样做:

Map<String, List<String>> badChars = new HashMap<>();
...
badChars.computeIfAbsent(key, __ -> new ArrayList<>())
  .add(badChar);

您的用例实际上是the example provided in the documentation

【讨论】:

  • 我的补充,但是: 1. 未使用变量的两个下划线需要解释或避免。 2. 我理解反对分段直译的论点,但“不要”可以更温和地表述。就像外国人说你的母语一样。
  • 这是一个很好的答案,因为它实际上改进了代码示例,并获得了他们正在寻找的“真实”解决方案。只要人们清楚computerIfAbsent 不是 TryGetValue 的通用替代品。
  • 好吧,谢谢它解决了我的问题! Don't try to blindly copy and paste code between languages without learning at least the basics你可能是一名大四学生,而我还是一名大一学生,这就是我正在做的事情我还在学习如果我正在克隆代码我不会在这里问人们可以在哪里帮助我并可能解释!重读你的答案并意识到它是多么的卑鄙!无论如何谢谢:))
猜你喜欢
  • 2011-10-15
  • 2023-03-10
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
相关资源
最近更新 更多