【问题标题】:Checking for a null element with Java Vector class使用 Java Vector 类检查空元素
【发布时间】:2012-08-20 03:26:59
【问题描述】:

我正在构建一个堆数据结构,但让我发疯的部分是检查空子值。

我正在使用一个向量,我正在比较一个父母和一个孩子,但如果只有一个孩子,程序就会崩溃,因为类似

vectorObject.get(i) //i'th element doesn't exist 

将返回异常。

我无法使用类似的东西检查 null 元素

if (vectorObject.get(i) == null)

既然运行 get() 方法会自动中断程序,那么如何在没有一些难以理解的怪异黑客攻击的情况下实际检查不存在的元素??

【问题讨论】:

  • 来自the Javadoc 的注释:“与新的集合实现不同,Vector 是同步的。如果不需要线程安全实现,建议使用 ArrayList 代替 Vector。 "
  • 谢谢。但是我不会也遇到与 ArrayList 相同的问题吗?
  • 这只是一般性的建议,而不是针对您的问题的具体答案。我实际上建议不要使用Vector,即使在多线程程序中也是如此。相反,ArrayList doc 建议在多线程环境中使用Collections.synchronizedList
  • 谢谢,我知道,这是为了我自己的算法技能,而不是生产代码。另外,我不明白反对票..我认为这是一个完全正常的问题。在 SO 上获得任何积分都已经够难了..sigh.
  • 投反对票的不是我——我也不明白。我仍然建议将您的 Vector 更改为 ArrayList 只是为了养成使用正确数据结构的习惯。

标签: java vector null


【解决方案1】:

你似乎很困惑。我认为您需要重新阅读用于设计堆数据结构的任何参考资料(或阅读the relevant section of the Wikipedia article)。

如果您的父母在0,那么您的孩子在2*(0)+1=12*(0)+2=2。在这种情况下,1 < vectorObject.size() 为真,而2 < vectorObject.size() 为假,表示有左孩子但没有右孩子。

由于Vector(或ArrayList,如果您已按照我的建议切换)是从零开始的,您需要检查是i < vectorObject.size(),而不是i <= vectorObject.size()。如果i < vectorObject.size()i 是合法索引。

更新:

您可以通过两种方式在此处构建逻辑。如果您必须以完全不同于二孩情况的方式处理单子情况,那么这可能效果最好:

int size = vectorObject.size();
if (2*i+2 < size) { /* Two-child case */ }
else if (2*i+1 < size) { /* One-child case */ }
else { /* No children case */ }

如果你分别处理两个节点,那么嵌套可能会更好:

int size = vectorObject.size();
if (2*i+1 < size) {
  // Handle left child
  if (2*i+2 < size) {
    // Handle right child
  }
  else {
    // No right child
  }
}
else { /* No children */ }

【讨论】:

  • 是的,我知道这一点。而且我仍然可以正确实现它。问题是当右孩子不存在而左孩子存在时。使用这种方法,这基本上意味着只是为了检查一个空值,我需要有两个单独的逻辑路径——一个用于当左孩子存在而没有右孩子时,一个当两者都存在时。以及每个路径中实际堆逻辑的更多逻辑。这会创建一些非常不可读的代码。
  • @volk - 将部分代码重构为新方法(例如 handleLeftChildhandleRightChild)可能有助于缓解代码可读性较差的问题。
  • @volk - 我在回答中说“您似乎很困惑”的原因是因为您一直说您需要“检查空值”。希望您现在可以看到,无需在此代码中的任何位置检查 null — 您只需进行边界检查即可。
【解决方案2】:

尝试/捕捉:

try{

yourVector.get(int theElementYouWant);

}

catch(NullPointerException){

//well, I guess that element was null!

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多