java 2D数组 - 排序和搜索

时间:2015-04-19 19:46:17

标签: java arrays performance sorting

最近,在为大学做作业时,我遇到的一件事就是整理和搜索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}只在程序运行时出现,而不是在编译时出现?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

除了java.util.ArraysdeepHashCode之外,

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(),以便很好地表示您正在打印的内容。