代码在多个二维阵列搜索类似entires(Code for searching similar en

2019-10-29 10:19发布

我正尝试写在描述该问题的代码我以前的话题 。 建议的解决方案是使用包含HashMap找到类似的条目在多个阵列(数组中有相同的列数,但他们可能有不同的行数)。

下面是根据约翰·B提供的用户的代码片段我的示例代码在这里 。 为了简单和用于调试目的,我刚创建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 I签出建议的解决方案,但功能即使对于返回false:INT []数组1 = {1,2,3}; INT []数组2 = {1,2,3}; INT [] ARRAY3 = {1,2,3},虽然它应该是真实的。 我认为这个问题是与功能hashcode 。 因此,任何解决办法吗?

Answer 1:

这条线是错误的,它会立即返回true:

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

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

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


Answer 2:

它是只得到尽可能每个数组中测试的第一个元素,并因为它们匹配返回true。

您需要返回false,如果任何不匹配,然后如果没有故障返回true。

我想也把长度的测试在equalRows方法的开始。



文章来源: Code for searching similar entires in multiple two-dimensional arrays