【问题标题】:java 2D Arrays - sorting and searchingjava 2D Arrays - 排序和搜索
【发布时间】:2015-06-26 10:00:31
【问题描述】:

最近,在为大学做作业时,我遇到的一件事是对二维数组进行排序和搜索。 使用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, [我@1f194d9]

这是什么,最重要的是解决这些问题的最佳方法是什么?

还有一个后续问题 - 为什么有些错误(如 example cannot be cast to java.lang.Comparable 仅在程序运行时出现,而不是在编译时出现?

非常感谢任何帮助。

【问题讨论】:

  • 如果您显示更多代码会有所帮助,特别是您填充数组的位置以及填充什么
  • 对二维数组进行排序毫无意义。你会如何对{{1, 4}, {2, 3}} 进行排序? +++ 我不得不使用嵌套的 for 循环而不是二分搜索,虽然我希望这样做是有效的方式。 - 二分搜索是有效的,但仅限于已经 i> 排序数组。如果加上分拣的费用,那就不赔了。

标签: java arrays performance sorting


【解决方案1】:

java.util.Arrays,除了deepHashCodedeepEquals,不对数组进行递归操作。

例如:

int[ ][ ] arr = new int[ h ][ w ];
Arrays.sort( arr ); \\ Sorts int[ ] not ints
Arrays.asList( arr ); \\ Returns List< int[ ] >

相对于整个数组对 2D 数组进行排序没有多大意义,最好将其存储为 1D 数组。对二维数组进行二分搜索也是如此。

如果要对对象进行排序,有两种方法。最好的方法是让类实现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[ ][ ]

【讨论】:

    【解决方案2】:

    第一个问题

    示例不能转换为 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() 方法,以便更好地表示您正在打印的内容。

    【讨论】:

    • 但它不能,因为它是int[]
    • @maaartinus 你为什么这么认为?他有一个寻找.contains("xyz")的例子
    • 因为I 表示int 并且因为[I@some_numbers 是标准toString 数组的输出。主要是因为关于sorting and searching a 2D-arrayint[][] 的OP 只是一个int 数组的数组。
    猜你喜欢
    • 2017-01-19
    • 1970-01-01
    • 2010-12-03
    • 2012-08-28
    • 1970-01-01
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多