Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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_Hashcode - Fatal编程技术网

Java 在二维数组中查找相似行的代码

Java 在二维数组中查找相似行的代码,java,arrays,hashcode,Java,Arrays,Hashcode,我试图在多个二维数组中找到类似的行,如中所述。对于下面给出的示例,答案是false,true,,尽管它应该是false,false 另一个非常重要的问题是如何将此代码调整为具有不同行数的数组 我非常感谢任何帮助。谢谢 import java.util.ArrayList; import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args)

我试图在多个二维数组中找到类似的行,如中所述。对于下面给出的示例,答案是
false,true,
,尽管它应该是
false,false

另一个非常重要的问题是如何将此代码调整为具有不同行数的数组

我非常感谢任何帮助。谢谢

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class Test {

    public static void main(String[] args) {
        ArrayList<Integer[]> array1 = new ArrayList<Integer[]>(); 
        ArrayList<Integer[]> array2 = new ArrayList<Integer[]>();
        ArrayList<Integer[]> array3 = new ArrayList<Integer[]>();
        array1.add(new Integer[]{1,2,3}); array1.add(new Integer[]{1,0,3});
        array2.add(new Integer[]{1,0,3}); array2.add(new Integer[]{0,0,3});
        array3.add(new Integer[]{1,2,3}); array3.add(new Integer[]{0,3,3});
        for (int i=0; i<array1.size(); i++) {
            boolean answ = equalRows(array1.get(i),array2.get(i),array3.get(i));
            System.out.println(answ);
        }
    }
    
    static class Row extends Object {
        private int value;
        
        public Row(int val) {
            this.value = val;
        }
        
        @Override
        public boolean equals(Object obj) {
            if(this == obj)
                return true;
            if((obj == null) || (obj.getClass() != this.getClass()))
                return false;
            // object must be Row at this point
            Row row = (Row)obj;
                return (value == row.value);
        }
        
        @Override
        public int hashCode () {
            return this.value;
        }
    }

    private static Map<Row, Integer> map(Integer[] row) {
          Map<Row, Integer> rowMap = new HashMap<Row, Integer>();
          for (int i=0; i<row.length; i++)
              rowMap.put(new Row(row[i]), i);
          return rowMap;
    }

    private static boolean equalRows(Integer[] row1, Integer[] row2, Integer[] row3){
           Map<Row, Integer> map1 = map(row1);
           Map<Row, Integer> map2 = map(row2);

           for (int i=0; i<row3.length; i++){
              Row row = new Row(row3[i]);
              Integer result1 = map1.get(row);
              Integer result2 = map2.get(row);
              if (result1 == null || result2 == null) {
                  return false;
              }
           }
        return true;
    }

}
import java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Map;
公开课考试{
公共静态void main(字符串[]args){
ArrayList array1=新的ArrayList();
ArrayList array2=新的ArrayList();
ArrayList array3=新的ArrayList();
add(新整数[]{1,2,3});array1.add(新整数[]{1,0,3});
add(新整数[]{1,0,3});array2.add(新整数[]{0,0,3});
array3.add(新整数[]{1,2,3});array3.add(新整数[]{0,3,3});

对于(int i=0;i我不太确定您想要实现什么,但您的问题是否存在于方法中

public boolean equals(Object obj) {
        if(this == obj)
            return true;
        if((obj == null) || (obj.getClass() != this.getClass()))
            return false;
        // object must be Row at this point
        Row row = (Row)obj;
            return (value == row.value);
    }
因为

if(this == obj)
例如,您希望进行值比较,但使用“==”comperator得到的是两个对象引用的比较

所以也许

if(this.equals(obj))
这是你想要的吗

此外,您是否尝试过在每个语句的调试模式下单步执行代码?我想这样做可以很快找到您的错误


干杯:)

要比较两个数组,请忽略可以使用的空值

public static <T> boolean equalsExceptForNulls(T[] ts1, T[] ts2) {
    if (ts1.length != ts2.length) return false;
    for(int i = 0; i < ts1.length; i++) {
       T t1 = ts1[i], t2 = ts2[i];
       if (t1 != null && t2 != null && !t1.equals(t2)) 
           return false;
    }
    return true;
}

public static <T> boolean equalsExceptForNulls3(T[] ts1, T[] ts2, T[] ts3) {
    return equalsExceptForNulls(ts1, ts2) && 
           equalsExceptForNulls(ts1, ts3) && 
           equalsExceptForNulls(ts2, ts3);
}
// or generically
public static <T> boolean equalsExceptForNulls(T[]... tss) {
    for(int i = 0; i < tss.length - 1; i++)
       for(int j = i + 1; i < tss.length; j++)
           if(!equalsExceptForNulls(tss[i], tss[j]) 
               return false;
    return true;
}
公共静态布尔等式ExceptForNulls(T[]ts1,T[]ts2){
if(ts1.length!=ts2.length)返回false;
对于(int i=0;i

您遇到的问题是,array3用于确定要比较的行

在第一个测试中,您正在比较第1、2、3行,而在第二个测试中,您正在比较第0和3行。第一个测试应为false,第二个测试应为true

我通过在调试器中单步检查代码发现了问题。我建议您也这样做


我还将使用
int[]
而不是
Integer[]

导致此错误的方法存在一个基本问题。您正在使用映射来确定元素在其他行中的位置。在构建映射时,如果行中有重复的元素,则它们以前的索引将被覆盖。这正是您的情况下发生的情况。存在重复零在第二个数组的第二行中

下面是第二排的地图

map1 = ((Row(1), 0), (Row(0), 1), (Row(3), 3))
map2 = ((Row(0), 1), (Row(3), 3)) 
注意:map2 bcoz中只有两个元素,第一个元素与第二个元素重叠。当使用第三个数组中第二行的元素进行查找时,查找始终成功(因为它只查找0和3,从不查找1)

此外,您检查故障的条件不完整,即

if (result1 == null || result2 == null) {
    return false;
}
应该是

if (result1 == null || result2 == null || !result1.equals(i) || !result2.equals(i)) {
    return false;
}
在我看来,您根本不应该使用映射。而是逐个比较每个元素。要概括不同长度数组的代码,请尝试使用ArrayList类的size()方法


如果使用映射对您很重要,那么您应该使用每个数组元素的索引作为键,使用行对象作为值,而不是使用相反的操作。

If(this.equals(obj))
是此方法试图实现的。如果调用此函数,它将进入无限递归。是的,我进行了除格,发现HashMap不允许保留类似的条目,例如,它将保留{0,0,3}和{0,3,3},而不是{0,3}.所以,这些行变得相似,尽管它们不同。我被这段代码困住了…我只需要在多个二维数组中找到真正相似的行。就是这样。哦,是的,你是对的!我没有注意到他重写了equals方法。嗯,这是一次尝试:)在第一次测试中,我比较了{1,2,3}、{1,0,3}和{1,2,3}在第二行:{1,0,3},{0,0,3},{0,3,3}。第二行的问题是{0,0,3}和{0,3,3}被处理为{0,3}。我不知道如何修改代码来尊重{0,0,3}和{0,3,3}(我仍然应该使用HashMap)。但你不是在比较这三个数组,你只是在比较前两个数组,第三个数组用来确定要比较的行。我不明白你为什么要使用
哈希映射
。我只能承担它的家庭作业,所以我不知道如何在不重新编写代码的情况下更改代码。你必须e以明确定义您试图执行的操作,并确保您的代码在调试器中执行该操作。您应该尝试在代码中明确您试图实现的操作以及做出选择的原因。其思想是,首先我从array1和array2中提取行,并将它们放入映射中。然后我从array3中提取行,并尝试查找它在地图中。如果我找不到它们,那就意味着行不相似。试试
数组.equals(array1,array2)和&Arrays.equals(array1,array3)
?你说的相似是什么意思?它们有多大的不同,但仍然相似?