我正在做一个课堂作业,我们在其中模拟购票程序。在这种情况下,我有一个方法应该拖曳一个数组并找到第一个匹配项。但是,每行的第一列将作为匹配返回,而不仅仅是找到的第一列。
//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;
}
答案 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循环就足够了。
希望这会有所帮助!