我正在尝试用Java开发一个算法,给定两个矩阵(假设a
和b
),如果{中至少有一行相同则返回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
?
答案 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;
}