最近,在为大学做作业时,我遇到的一件事就是整理和搜索2D阵列。
使用Arrays.sort(example);
或Arrays.binarySearch(example, "xyz");
会返回错误:
示例无法强制转换为java.lang.Comparable
我不得不使用嵌套for循环,而不是二进制搜索,尽管我希望以有效的方式进行。
我遇到的另一个问题是使用Arrays.asList(example).contains("xyz");
,这似乎从来没有用过。然后我使用System.out.println(Arrays.asList(example));
来检查错误。这就是我得到的:
[[I @ 1575c7e,[I @ 795f24,[I @ 554210,[I @ 16433e4,[I @ 18ada25,[I @ f7bd29,[I @ a3cf3e,[I @ 7af3e0,[I @ 21151e,[ I @ 1f194d9]
这是什么,最重要的是解决这些问题的最佳方法是什么?
以及后续问题 - 为什么有些错误(例如example cannot be cast to java.lang.Comparable
}只在程序运行时出现,而不是在编译时出现?
非常感谢任何帮助。
答案 0 :(得分:2)
java.util.Arrays
和deepHashCode
之外, deepEquals
不会递归地对数组进行操作。
例如:
int[ ][ ] arr = new int[ h ][ w ];
Arrays.sort( arr ); \\ Sorts int[ ] not ints
Arrays.asList( arr ); \\ Returns List< int[ ] >
相对于整个阵列对2D阵列进行排序并没有多大意义,最好只将其存储为一维阵列。二进制搜索2D数组也是如此。
如果要对对象进行排序,有两种方法可以执行此操作。最好的方法是让类实现java.lang.Comparable
。如果您无法编辑该类或想要提供多种方法对对象进行排序,则可以实现java.util.Comparator
并将其实例传递给Arrays.sort
。
为了使用java.util.Arrays
对数组进行排序或搜索,数组对象的类型必须实现java.lang.Comparable
,您必须提供java.util.Comparator
的实例。请记住,它必须与在数组的第一级找到的对象类型相同。
例如:
int[ ] arr1 = ...; \\ Type of first level is int
int[ ][ ] arr2 = ...; \\ Type of first level is int[ ]
int[ ][ ][ ] arr3 = ...; \\ Type of first level is int[ ][ ]
答案 1 :(得分:1)
第一个问题:
示例无法强制转换为java.lang.Comparable
example
中的项目应实现Comparable界面,并覆盖方法Compare()
,否则Arrays.sort()
不会“知道”按哪个顺序对项目进行排序。
第二个问题,打印显示为:
[[I@1575c7e, [I@795f24, [I@554210, [I@16433e4, [I@18ada25, [I@f7bd29, [I@a3cf3e, [I@7af3e0, [I@21151e, [I@1f194d9]
从中example
实例化元素的类也应该覆盖方法toString(),以便很好地表示您正在打印的内容。