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

时间:2018-11-05 00:00:11

标签: java arrays

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

//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 个答案:

答案 0 :(得分:0)

break语句将跳出最里面的循环(对于j)。您假定它脱离了外部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;
}

答案 1 :(得分:0)

之所以发生这种情况,是因为您的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循环就足够了。

希望这会有所帮助!