Java 检查一维数组是否是另一个二维数组每行的子集
假设有一个一维数组test[]={1,2,3}和一个二维数组arr1[3][5]={{1,2,5,4,3},{3,7,1,4,2},{2,9,7,8,3} 输出所需的内容如下:Java 检查一维数组是否是另一个二维数组每行的子集,java,arrays,Java,Arrays,假设有一个一维数组test[]={1,2,3}和一个二维数组arr1[3][5]={{1,2,5,4,3},{3,7,1,4,2},{2,9,7,8,3} 输出所需的内容如下: test is the subset of row 0 of arr1 test is the subset of row 1 of arr1 test is not the subset of row 2 of arr1 以下是我迄今为止实现的代码: class GFG { public static voi
test is the subset of row 0 of arr1
test is the subset of row 1 of arr1
test is not the subset of row 2 of arr1
以下是我迄今为止实现的代码:
class GFG {
public static void main(String args[]) {
int arr1[][] = { { 11, 1, 13, 3, 7 },
{ 11, 1, 17, 7, 3 },
{ 2, 5, 8, 9, 10 } };
int test[] = { 11, 3, 7, 1 };
int m = arr1.length; // rows
int n = test.length;
int o = arr1[0].length; // no. of elements in each row
System.out.println(o); // just for testing if it works
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < m && j != m; j++) {
for (k = 0; k < o; k++)
if (test[i] == arr1[j][k])
break;
if (k == o)
System.out.println("test[] is " + "not a subset of arr1 " + j + " row");
else
System.out.println("test[] is " + "subset of arr1 " + j + " row");
}
}
}
}
但我从中得到的结果是:
我意识到这是一个重复打印的循环,但在这种情况下,我仍然没有得到令人满意的输出
这里可以做什么?
或者这个问题有一个非常优化的实现?
欢迎任何建议。你搞乱了循环顺序:你应该先迭代arr。其思想是使用标志:isSubset,当某个元素在一行中找不到时变为false,包含,如果当前选中的元素在一行中,则变为true 有一些改进可以做,比如foreach循环和标记中断,但我决定保持代码简单
public class GFG {
public static void main(String args[]) {
int arr[][] = { { 11, 1, 13, 3, 7 },
{ 11, 1, 17, 7, 3 },
{ 2, 5, 8, 9, 10 } };
int test[] = { 11, 3, 7, 1 };
for (int i = 0; i < arr.length; i++) {
boolean isSubset = true;
for (int j = 0; j < test.length; j++) {
boolean contains = false;
for (int k = 0; k < arr[i].length; k++) {
if (test[j] == arr[i][k]) {
contains = true;
break;
}
}
if (!contains) {
isSubset = false;
break;
}
}
if (isSubset) {
System.out.println("test[] is " + "subset of arr " + i + " row");
} else {
System.out.println("test[] is " + "not a subset of arr " + i + " row");
}
}
}
}
尝试将您的解决方案分解为更小的方法,这样您的代码将更清晰,并且您可以更容易地思考正在发生的事情。下面是一个如何实现的示例:
class GFG {
public static void main(String args[]) {
int arr1[][] = { { 11, 1, 13, 3, 7 },
{ 11, 1, 17, 7, 3 },
{ 2, 5, 8, 9, 10 } };
int test[] = { 11, 3, 7, 1 };
System.out.println(arr1[0].length); // just for testing if it works
for (int i = 0; i < arr1.length; i++) {
if (isSubset(test, arr1[i])) {
System.out.println("test[] is " + "subset of arr1 " + i + " row");
} else {
System.out.println("test[] is " + "not a subset of arr1 " + i + " row");
}
}
}
/* returns true if arr contains all elements of sub */
static boolean isSubset(int[] sub, int[] arr) {
for (int e : sub) {
if (!contains(e, arr)) return false;
}
return true;
}
/* returns true if arr contains elem */
static boolean contains(int elem, int[] arr) {
for (int e : arr) {
if (elem == e) return true;
}
return false;
}
}
试着用调试器运行你的程序,看看哪里出了问题。首先,如果k==o,你需要一个else。你已经设置了else并更新了输出以供参考:我认为这个问题非常相似/应该可以帮助你找到答案。甚至我都认为我弄糟了循环。谢谢