java - 在多个二维数组中搜索相似条目的代码

标签 java arrays hashmap

我正在尝试为 my previous topic 中描述的问题编写代码。建议的解决方案是使用 HashMap 在多个数组中查找相似的条目(数组具有相同的列数,但它们可能具有不同的行数)。

下面是我的示例代码,基于用户 John B 提供的代码片段 here 。为了简单起见和调试目的,我只创建了 3 个不同的一维行而不是二维数组。另外,为了简单起见,函数 equalRows 应返回 truefalse 而不是行索引。

因此,在下面的代码中,函数 equalRows 应该返回 false,因为 array3{1,3,4} 并且它确实有 {1,2,3}。相反,该函数返回true。为什么会发生这种情况?

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

public class Test {

    public static void main(String[] args) {
        int[] array1 = {1,2,3}; 
        int[] array2 = {1,2,3}; 
        int[] array3 = {1,3,4};
        boolean answ = equalRows(array1,array2,array3);
        System.out.println(answ);
    }

    static class Row extends Object {
        private int value;
        private volatile int hashCode = 0;

        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 () {
            final int multiplier = 7;
            if (hashCode == 0) {
                int code = 31;
                code = multiplier * code + value;
                hashCode = code;
            }
            return hashCode;
        }
    }

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

    private static boolean equalRows(int[] array1, int[] array2, int[] array3){
           Map<Row, Integer> map1 = map(array1);
           Map<Row, Integer> map2 = map(array2);

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

}

编辑#1 代码已根据建议的解决方案进行更新。

编辑#2 我检查了建议的解决方案,但该函数甚至返回 false: int[] array1 = {1,2,3}; int[] array2 = {1,2,3}; int[] array3 = {1,2,3},尽管它应该是正确的。我认为问题出在函数 hashcode 上。那么,有什么解决办法吗?

最佳答案

这行是错误的,它立即返回true:

if (array1Row != null && array2Row != null) {
    return true;
}

你必须做的是这个(完全颠倒逻辑):

if (array1Row == null || array2Row == null) {
    return false;
}

关于java - 在多个二维数组中搜索相似条目的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8789979/

相关文章:

java - 是否有任何范围 slider 来选择时间段?

java - 启动java应用程序

java - Java 中私有(private)内部类的访问标志 - 规范与反射 API 不一致?

c++ - 使用 std::sort 对二维 c 数组进行排序

javascript - 将数组保存为键中的值并循环遍历它们以获取键

javascript - 查找循环数组中任意两个索引之间的中间索引

java - 美国公司(JAVA) : Algorithms Complete Search

algorithm - 探测哈希表

java - 存储 HashMap 值与引用值的效率

java - 打印随机键后跟特定值?