【问题标题】:Can't use binary search with Object Arraylist?不能对 Object Arraylist 使用二进制搜索?
【发布时间】:2015-06-09 21:55:55
【问题描述】:

我尝试使用带有 Arraylist 的二进制搜索,它给了我这样的信息:

Collections 类型中的方法 binarySearch(List>, T) 不适用于参数 (ArrayList, String)

代码如下:

ArrayList <Object> a = new ArrayList <Object> ();
String date = JOptionPane.showInputDialog(null, "Please enter the date.")
int index = Collections.binarySearch(a, date);

二分查找应该从包含多个日期的数组 (a) 中返回特定日期的位置。我做错了什么?

【问题讨论】:

  • 请给我们看一下a的声明。
  • 如果您的问题得到解答,请记得给accept an answer

标签: java binary-search


【解决方案1】:

要执行二分搜索,您的Collection 必须进行排序。为了对某些东西进行排序,这个东西需要有一个明确定义的顺序。也就是说,Comparable&lt;T&gt; 接口的用途。 Object 没有实现Comparable&lt;Object&gt;,因此无法对Object 中的List 进行排序(没有对它们进行排序的标准)。 详情请查看API

【讨论】:

  • 谢谢。问题是,我的数组将同时包含双精度和字符串,那么我将如何在数组中搜索双精度和字符串中的特定字符串?
  • @Vctrm6 你的意思是你的ArrayList,对吧?我认为您的算法被设计破坏了。要么将 doubles 作为字符串存储在 ArrayList&lt;String&gt; 中,然后将它们重新解析为双精度(肮脏的解决方法),要么过度考虑您的设计,因此您不需要将 Strings 和 doubles 存储在相同的列表。
【解决方案2】:

a 应该是 List&lt;String&gt;,而不是 List&lt;Object&gt;Collections.binarySearch 期望该列表包含您正在搜索的相同类型,而共同的最低类型——Object——不是Comparable,因此它不能用于二分搜索。

【讨论】:

  • 好的,谢谢。问题是,我的数组将同时包含双精度和字符串,那么我将如何在数组中搜索双精度和字符串中的特定字符串?
  • 那么你不能使用binarySearch。你可以使用indexOf,并接受它需要 O(n)。 (但坦率地说,像这样在同一个列表中混合两种不同的类型是一种巨大的设计气味,表明你做错了。)
  • @Vctrm6 您可以将其作为评论发布在您的问题下,而不是问我们两个相同的问题。无论如何,你得到了相同的基本答案:糟糕的设计。
【解决方案3】:

对象没有实现Comaparable&lt;Object&gt;。您必须提供Comparator&lt;Object&gt;

    ArrayList <Object> a = new ArrayList<>();
    // add elements to a.
    Comparator<Object> comparator = (x, y) -> x.toString().compareTo(y.toString());
    Collections.sort(a, comparator);
    String date = JOptionPane.showInputDialog(null, "Please enter the date.")
    int index = Collections.binarySearch(a, date, comparator);

这段代码中的comparatoer只是一个例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 2015-01-21
    • 2017-03-26
    • 2013-09-29
    • 2013-04-13
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多