我有一个函数,它返回给定键的int
值(来自HashMap<String, Integer>
)。如果密钥不存在,我想返回调用者可以检查的内容。看来,最常见的情况是,这将是“返回-1,如果密钥不存在”的那种东西。但是,在我的情况下,我不能为此目的保留-1,因为负数是做存在的键的可行值。
我能够提出的唯一其他选择如下:
Integer
包装器类并检查null
Integer.MIN_VALUE
boolean keyExists(String key)
函数float
并使用NaN
代替我是用Java编写的,但欢迎来自相似语言背景的人发帖。谢谢!
答案 0 :(得分:14)
在我看来,第一个选择是最干净的。像-1和Integer.MIN_VALUE这样的幻数有点混乱,尤其是当值不直观时。这是一个惯用的C解决方案,Java开发人员会讨厌你。根据您实际使用的内容,如果仅在“异常”情况下发生这种情况,您也可以抛出“KeyNotFoundException”。
答案 1 :(得分:3)
我投票支持在这里抛出一个检查过的例外。一般来说,我不喜欢检查过的异常,但在这种情况下,这似乎是合理的。不存在该值的情况将需要与存在该值的情况分开处理,使用异常将使其清楚。
实际上,添加keyExists方法的想法是您列出的最佳想法,因为它不依赖于用户知道寻找特殊值。如果你这样做那么你可以抛出异常作为备份计划,以防地图内容在对keyExists的调用和检索之间发生变化。
答案 2 :(得分:1)
虽然它在很大程度上取决于应用程序并且知道约束,但我更喜欢上面的#1。原因是因为它是显而易见的 - 根据我的经验,拥有一个明确的情况总是比隐含的更好 - 比如MIN_VALUE。
另一种选择是让包装器对象包含结果值作为基本int,但也具有状态值或类似的东西。所以它可能是这样的:
public class Wrapper {
private int value = Integer.MIN_VALUE;
private boolean isValid;
// appropriate getters and setters etc.
}
根据问题的复杂程度,您还可以包含枚举而不是布尔值来替换状态。如果您看到此元素包含复合信息 - 单键键控的信息集或类似的东西 - 容器对象或状态对象在这些情况下非常有价值。
答案 3 :(得分:1)
float是不安全的,因为并非所有int值都可以准确地表示为int值。 long是一个更好的选项,因为所有int值都可以安全存储,并且你会有更多的值找不到。
如果您正在使用Map,那么您还有一个Integer对象,所以为什么不返回它(或null)
如果你真的想使用原语(为了效率?),我建议你改为TObjectIntHashMap。这使用原始int值。要检查absense,你必须单独检查containsKey()。
答案 4 :(得分:1)
两种情况是典型的:
如果假设1错误,则可能表示存在错误,因此请使用断言保护您在访问方法中的假设。
如果2适用,您如何确定返回的内容?所以提供一个测试方法,如“keyExists”,并在访问地图之前绝对知道。
在案例1中,不需要检查,这更加清晰,但如果您错了,访问将失败。 对于特殊情况,例如-1或Integer.MIN_VALUE,很难确定它们是否会被使用。
像Haskell,Scala和C#这样的语言有特殊的类型来传达一个值的存在/缺失,这比使用null要好得多(如果你忘记测试你可能会得到一个NullPointerException)
答案 5 :(得分:0)
选项5:抛出异常
虽然在这种情况下,我会投票使用Integer类。
答案 6 :(得分:0)
我认为你应该结合选项#1和#3,因为这与底层HashMap的行为一致。来自HashMap的get method documentation:
返回指定键在此标识哈希映射中映射到的值,如果映射不包含此键的映射,则返回null。返回值null不一定表示映射不包含键的映射;地图也可能显式地将键映射为null。 containsKey方法可用于区分这两种情况。
答案 7 :(得分:0)
- 将返回类型更改为Integer包装器类并检查是否为null。
醇>
这是更常见的选择。