如何检查两个矩阵是否有相同的行?

时间:2018-02-01 13:06:17

标签: java algorithm matrix

我正在尝试用Java开发一个算法,给定两个矩阵(假设ab),如果{中至少有一行相同则返回true {1}}和a

这是我尝试的方法:

b

这是一个简单的主要内容:

public static boolean check_row(int a[][], int b[][]){
        boolean check = false;
        for(int i = 0; i < a.length; i++){
            for(int j = 0; j < b[0].length; j++){
                if(a[i][j] == b[i][j])
                    check = true;
            }
        }
        return check;
    }

这里我得到public static void main(String[] args){ int a[][] = {{1,2}, {3,4}}; int b[][] = {{1,2}, {7,8}}; System.out.println(check_row(a, b)); } ,因为两个矩阵的第一行是相同的。 但是,如果我将矩阵初始化更改为:

true

我得到int a[][] = {{1,2}, {3,4}}; int b[][] = {{5,6}, {1,2}}; ,即使false的第一行和a的第二行相同。

我应该如何修改方法以便在两种情况下获得b

4 个答案:

答案 0 :(得分:6)

你的条件太简单......高级的想法是,a和b中的每一行选择一行,然后确定它是否相同,所以你需要3个循环...

代码:

public class SameRowFinder {

    public static void main(String[] args){
        int a[][] = {{1,2},{3,4}};
        int b[][] = {{1,2}, {7,8}};
        System.out.println(hasSameRow(a, b));

        int aa[][] = {{1,2},{3,4}};
        int bb[][] = {{5,6}, {1,2}};
        System.out.println(hasSameRow(aa, bb));
    }

    private static boolean hasSameRow(int[][] a, int[][] b) {
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < b.length; j++) {
                if (isSameRow(a[i], b[j])) {
                    System.out.printf("Same rows are %d and %d (0-based).%n", i, j);
                    return true;
                }
            }
        }
        return false;
    }

    private static boolean isSameRow(int[] row1, int[] row2) {
        if (row1.length != row2.length) {
            throw new IllegalArgumentException("rows with different length");
        }
        for (int i = 0; i < row2.length; i++) {
            if (row1[i] != row2[i]) {
                return false;
            }
        }
        return true;
    }
}

此外,您不需要为数组比较编写自己的函数,但使用Arrays.equal(int[], int[]),但它只会隐藏第3个循环。上面的方法在数组长度不同的情况下抛出运行时异常。确定Arrays.equal(int[], int[])实现了一些提示(检查相等+空检查)是非常值得的。

答案 1 :(得分:2)

您的第二个循环中有错误。 变化:

for(int j = 0; j < b[0].length; j++)

for(int j = 0; j < b.length; j++){

此外,问题是你不能像你那样比较行。 您必须检查行的长度是否相同,最后比较行。您将需要一个额外的for循环来比较行。

这个会做的伎俩:

public static boolean check_row(int a[][], int b[][]){
    boolean check = false;
    for(int i = 0; i < a.length; i++){
        for(int j = 0; j < b.length; j++){
            if (compareRows(a[i], b[j]))
                check = true;
        }
    }
    return check;
}

private static boolean compareRows(int[] row1, int[] row2) {
    if (row1.length == row2.length) {
        for (int i = 0; i < row2.length; i++) {
            if (row1[i] != row2[i]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

public static void main(String[] args){
    int a[][] = {{1,2},{3,4}};
    int b[][] = {{5,6}, {1,2}};
    System.out.println(check_row(a, b));
}

答案 2 :(得分:1)

在OP提供的示例中,b矩阵中的行循环丢失。

学习时,算法可写如下:

public static boolean check_row(int a[][], int b[][]) {
    int row_size = a[0].length;
    for (int i = 0; i < a.length; i++) {
        b: for (int j = 0; j < b.length; j++) {
            for (int k = 0; k < row_size; k++) {
                if (a[i][k] != b[j][k])
                    continue b; // move to next row in 'b' matrix
            }
            return true; // all elements in row were equal if we reached this point
        }
    }
    return false;
}

在现实生活中,它可能看起来像这样:

public static boolean check_row(int[][] a, int[][] b) {
    return Arrays.stream(b)
                 .anyMatch(rowB -> Arrays.stream(a).anyMatch(rowA -> Arrays.equals(rowA, rowB)));
}

答案 3 :(得分:0)

我希望此代码可以帮助您

public static boolean check_row(int a[][], int b[][])
{
    boolean check = false;

    for(int i = 0; i < a.length; i++)
    {

        for(int k = 0 ; k< b.length ; k++)
        {

            for(int j = 0 ; j<b[0].length ; j++)
            {
                if(a[i][j]!=b[k][j])
                {
                    break;
                }//if even one cell were not similar in both a and b break
                else
                {
                    if(j==b[0].length-1)
                    {
                        check = true;
                    }//if you haven't broken the loop yet and if j went till the end
                }//else if they are equal

            }//j to go through columns
            if(check == true)
            {
               break;
            }//for bringing down the time complexity
        }//k to go through b rows
        if(check == true)
        {
           break;
        }//for bringing down the time complexity
    }//i
    return check;
}