猿问

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

我正在做一个课堂作业,我们正在模拟购票程序。在这个我有一个方法应该拖网一个数组并找到第一个匹配项。但是,每行中的第一列作为匹配项返回,而不仅仅是找到的第一列。


//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;

  }


智慧大石
浏览 279回答 2
2回答

12345678_0001

发生这种情况是因为您的 break 语句只中断了内循环,而不是外循环,对于每个循环,您都需要一个 break 语句来退出循环,但在您的情况下,这不是必需的并且是脏的。但出于学习目的,我将向您证明:public static int seatAvailable(int [][] x, int y [][], int z){&nbsp; boolean found = false;&nbsp; int seat = 0;&nbsp; while (!found)&nbsp; {&nbsp; &nbsp; for (int i = 0; i < x.length; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; for (int j = 0; j < x[0].length; j++)&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (z == x[i][j])&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; found = true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x[i][j] = 0;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seat = y[i][j];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; if (found) break;&nbsp; &nbsp; }&nbsp; }&nbsp; return seat;}现在这将按您的预期工作,当函数找到第一个匹配项时,首先内部循环将被破坏,第二个 if 语句将破坏外部 for 循环。问题是您可以使用 return 语句立即循环并返回找到的座位,这样您就不需要任何 break 语句。这个解决方案也使得第一个 while 循环毫无意义,因为两个 for 循环就足够了。希望这可以帮助!

慕容森

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){&nbsp; int seat = 0;&nbsp; for (int i = 0; i < x.length; i++)&nbsp; {&nbsp; &nbsp; for (int j = 0; j < x[i].length; j++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; if (z == x[i][j])&nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; x[i][j] = 0;&nbsp; &nbsp; &nbsp; &nbsp; seat = y[i][j];&nbsp; &nbsp; &nbsp; &nbsp; return seat;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; }&nbsp; return seat;}
随时随地看视频慕课网APP

相关分类

Java
我要回答