我正尝试写在描述该问题的代码我以前的话题 。 建议的解决方案是使用包含HashMap找到类似的条目在多个阵列(数组中有相同的列数,但他们可能有不同的行数)。
下面是根据约翰·B提供的用户的代码片段我的示例代码在这里 。 为了简单和用于调试目的,我刚创建3个不同的一维的行而不是两维阵列。 此外,为了简单起见,功能equalRows
应该返回true
或false
排索引来代替。
因此,在下面的代码的功能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
。 因此,任何解决办法吗?