为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 数组中查找第一个匹配项(仅第一个)

在 Java 数组中查找第一个匹配项(仅第一个)

智慧大石 2021-12-30 16:22:08
我正在做一个课堂作业,我们正在模拟购票程序。在这个我有一个方法应该拖网一个数组并找到第一个匹配项。但是,每行中的第一列作为匹配项返回,而不仅仅是找到的第一列。//Define seatAvailable method/** * seatAvailable method checks to see if a seat is available at the current price * @param x The array of seat prices * @param y The array of seats * @param z The price of the seat requested * @return The number of the seat */public static int seatAvailable(int [][] x, int y [][], int z){  boolean found = false;  int seat = 0;  while (!found)  {    for (int i = 0; i < x.length; i++)    {      for (int j = 0; j < x[0].length; j++)      {        if (z == x[i][j])        {          found = true;          x[i][j] = 0;          seat = y[i][j];          break;        }      }    }  }  return seat;}我不是在寻找代码,而是在寻找解释。为什么将多个项目作为匹配项返回?编辑:回应以下:while (!found){  for (int i = 0; i < x.length; i++)  {    for (int j = 0; j < x[0].length; j++)    {       if (z == x[i][j])      {        found = true;        x[i][j] = 0;        seat = y[i][j];        break;      }    }    if (found == true)    {      break;    }  }}return seat;这是我尝试过的。记录显示数组中的多个项目被分配为“0”。编辑#2:我尝试了很多变化,这是最新的。这个版本的奇怪之处在于它将数组中的 6 个项目(在外部循环/行中)更改为 0 然后停止,即使它们在 . 如果它做到了全部或一项,我会理解,但这让我感到困惑。我认为最终它可能是执行此操作的主要方法的一部分,因为我尝试了许多变体来打破机器人行,但无论如何都会发布最后一点:  public static int seatAvailable(int [][] x, int y [][], int z)  {    int seat = 0;    for (int i = 0; i < x.length; i++)      {        for (int j = 0; j < x[0].length; j++)        {          if (z == x[i][j])          {            x[i][j] = 0;            seat = y[i][j];            return seat;          }        }      }    return seat;  }
查看完整描述

2 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

发生这种情况是因为您的 break 语句只中断了内循环,而不是外循环,对于每个循环,您都需要一个 break 语句来退出循环,但在您的情况下,这不是必需的并且是脏的。但出于学习目的,我将向您证明:


public static int seatAvailable(int [][] x, int y [][], int z)

{

  boolean found = false;

  int seat = 0;

  while (!found)

  {

    for (int i = 0; i < x.length; i++)

    {

      for (int j = 0; j < x[0].length; j++)

      {

        if (z == x[i][j])

        {

          found = true;

          x[i][j] = 0;

          seat = y[i][j];

          break;

        }

      }

      if (found) break;

    }

  }

  return seat;

}

现在这将按您的预期工作,当函数找到第一个匹配项时,首先内部循环将被破坏,第二个 if 语句将破坏外部 for 循环。


问题是您可以使用 return 语句立即循环并返回找到的座位,这样您就不需要任何 break 语句。这个解决方案也使得第一个 while 循环毫无意义,因为两个 for 循环就足够了。


希望这可以帮助!



查看完整回答
反对 回复 2021-12-30
?
慕容森

TA贡献1853条经验 获得超18个赞

break 语句将跳出最内层的循环(对于 j)。您假设它脱离了外部 for 循环(for i)。


这是更简洁的解决方案,它消除了不必要的 while 循环和 break 语句。


注意:在您的代码中,您有j <= x[0].length. 我觉得应该是j <= x[i].length?


public static int seatAvailable(int [][] x, int y [][], int z)

{

  int seat = 0;


  for (int i = 0; i < x.length; i++)

  {

    for (int j = 0; j < x[i].length; j++)

    {

      if (z == x[i][j])

      {

        x[i][j] = 0;

        seat = y[i][j];

        return seat;

      }

    }

  }


  return seat;

}


查看完整回答
反对 回复 2021-12-30
  • 2 回答
  • 0 关注
  • 277 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信