Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查一维数组是否是另一个二维数组每行的子集_Java_Arrays - Fatal编程技术网

Java 检查一维数组是否是另一个二维数组每行的子集

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[]={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 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并更新了输出以供参考:我认为这个问题非常相似/应该可以帮助你找到答案。甚至我都认为我弄糟了循环。谢谢