【问题标题】:(Java) Iterating through a Array until it hits an null value(Java) 遍历一个数组,直到它达到一个空值
【发布时间】:2017-02-14 14:40:40
【问题描述】:

我的问题是我希望 for loop 遍历一个数组,直到它达到 null 值,向数组中添加一个对象,然后停止遍历数组。

例如,当我按下一个键时,它会向数组中添加一个对象,但每次按下一个键时只会添加一个对象。

这是我的代码:

for(int i = 0; i<testArray.length; i++)
{
   if(testArray[i] == null)
   {
      testArray[i] = new object();
   }
}

非常感谢

【问题讨论】:

标签: java arrays loops for-loop


【解决方案1】:

有两种方法可以解决这个问题:您可以使用break 退出循环,也可以使用布尔标志

示例 1(中断)

for(int i=0;i<testArray.length;i++)
{
  if(testArray[i] == null)
  {
   testArray[i] = new object();
   break;
  }
 }

示例 2:布尔标志

boolean found = false;
for(int i=0;i<testArray.length && !found;i++)
{
  if(testArray[i] == null)
  {
   testArray[i] = new object();
   found = true;
  }
 }

【讨论】:

  • 我想的 3 种方法 - 3) 在方法中使用 return。宁愿 3) 胜过 1) 胜过 2)。不喜欢 2)。
  • 非常感谢,我只是想知道您会选择哪一个。 (这是更普遍接受的)
  • 我更喜欢break。对我来说,它使代码更清晰,堆栈帧更小。另一方面,break 不是“干净”的——它实际上就像一个 goto……但话说回来,我从来没有那么喜欢“干净”的编程——别开枪
  • @MightyGarlic break 也是我的偏好,但如果循环变大,那么我会将其分开并使用 return 代替。我也不喜欢#2——这是对周期的浪费,除了过度的复杂性之外并没有增加太多。一个标志只真正适用于打破嵌套循环,但这是唯一可以应用 goto 的情况之一(因为你可以直接在循环之后跳转,而不是打破循环,然后再次打破) .
  • @LukeBriggs 干杯,我已经使用 flag 方法有一段时间了,我想我会改用 break 方法。
【解决方案2】:

你可以做这样的事情:

int i = 0;
for(int i = 0; i<testArray.length && testArray[i] != null; i++);

if(i < testArray.length)
{
//now i will represent a position with a null element
testArray[i] = new object();
}

【讨论】:

  • 希望之后i &lt; testArray.length
  • 为了确保你可以在 if 条件中包含 testArray[i] = new object() ;)
  • 另外:仔细看,这不会编译。
【解决方案3】:

break找到元素后立即循环....

这就是你所缺少的:

for(int i = 0; i<testArray.length; i++) {
   if(testArray[i] == null) {
      testArray[i] = new object();
      break;
   }
}

【讨论】:

  • 寻找我忘记打破的文档..:P
【解决方案4】:

也许KeyListener 能帮上忙?您只需要侦听您尝试侦听的密钥并使用

检查它是否为空
for(int i = 0; i < record.length; i++)
        if(record[i] == null) {
            System.out.println(i+1 + " position is null");
        }

请随意自定义。 ControlAltDel 的中断解决方案也很有效。

【讨论】:

    【解决方案5】:

    如果您的testArray[]Object 的数组,那么您需要使用.equals() 来检查null,而不是==。然后,您可以添加break; 退出for-loop

    for(int i=0;i<testArray.length;i++)
    {
        if(testArray[i].equals(null))
        {
            testArray[i] = new Object();
            break;
        }
    }
    

    或者,您可以使用一个标志来指示是时候退出循环了

    private boolean keepLooping = true;
    private int i = 0;
    
    while(keepLooping)
    {
        if(testArray[i].equals(null))
        {
            testArray[i] = new object();
            keepLooping = false;
        }
    
        i++;
    }
    

    【讨论】:

    • 你不需要使用.equals()
    • @ChristopherSchneider 不仅如此,如果它 is 确实为 null,您将得到一个空指针异常以尝试取消引用它。
    • @ChristopherSchneider OP 可能,我们真的不知道。取决于该数组中的内容。 int[] testArray = new int[10] 不会通过空检查,因为 int 不能为空,例如。我们没有足够的信息。
    • 这对您的情况没有帮助。 int 没有 equals 方法,因为它是一个原始方法,因此甚至无法编译。我不确定打电话给.equals(null) 有一个单一的理由,因为正如@Michael 所说,你冒着NPE 的风险。补充一下,如果是null,而你使用==,你就说if(null == null),这很好。
    • 另外一种情况,如果编写 .equals() 方法的人由于某种原因没有检查 null,这也可能引发 NPE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多