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

标签 java arrays hashcode

我正在尝试在多个二维数组中查找相似的行,如 my previous post 中所述。 。对于下面给出的示例,答案是 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;
    }

}

编辑#1 在第一个测试中,我比较 {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)。

编辑#2 我的想法是,首先我从 array1 和 array2 中获取行,然后将它们放入映射中。然后我从 array3 中取出一行并尝试在 map 中找到它。如果我在这些 map 中都找不到它,则意味着行不相似。

最佳答案

要比较两个数组,可以忽略空值

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;
}

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

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

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

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

关于java - 在二维数组中查找相似行的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8800784/

相关文章:

java - hashCode() 在 Java 中的用途

java - hashCode() 应该返回对象的唯一 ID

java - 使用变量 String 或 char 作为对象名称

java - Objective-C 的 NSDictionary 的 Java 等价物是什么?

python - 将 Series 平铺到给定数组

c# - 有哪些方法可以实现动态数组?

c++ - 传递给对象时获取数组的长度

java - 尝试使用 MongoDB 设置 Querydsl 3.6.0,但未找到 MorphiaAnnotationProcessor

java - 在docker tomcat启动后运行命令

C++ hashCode - 处理大数(+ 模运算)