【问题标题】:Can't place String[] object in my Queue<String[]>无法将 String[] 对象放入我的 Queue<String[]>
【发布时间】:2014-02-28 18:17:43
【问题描述】:


我收到此错误java.lang.ClassCastException: [Ljava.lang.String; cannot be cast to java.lang.Comparable

这是有问题的代码。

final String[] methods = parseRule.getMethods();
// add to the param.
methodsToInsert.add(methods);  // <-- error from here

//Where
public String[] getMethods() {
    return new String[]{new String(parseMethod), new String(unParseMethod)};
}

//and param
Queue<String[]> methodsToInsert

//and at some point the methodsToInsert Object is
new PriorityQueue<String[]>();

我不完全确定为什么?任何建议


谢谢

哇,谢谢大家,我认为在以前的重构队列中是需要的,但随着它的发展,它不再需要,感谢您提供信息以及如何使用比较器进行修复。由于不再需要 PriorityQueue,我将返回 List。

【问题讨论】:

  • 是因为我正在使用 add 吗?不放?
  • 不,阅读错误信息。 add 接受(对于该队列接受)有一个(运行时)类型限制,即它们必须实现 Comparable。
  • @AnotherCompilerError 没错。没有数组实现 Comparable。
  • 你的队列具体是什么样的队列?你能发布一个可编译的例子吗?
  • 您可以使用带有Comparatorconstructor;你需要写一个String[]比较器。

标签: java queue priority-queue


【解决方案1】:

PriorityQueue 必须以某种方式对其元素进行排序,要么在其构造函数中接受 Comparator,要么依赖其元素为 Comparable

来自PriorityQueue javadocs

优先级队列的元素根据它们的自然顺序进行排序,或者由队列构造时提供的 Comparator 排序,具体取决于使用的构造函数。优先级队列不允许空元素。依赖自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致 ClassCastException)。

您没有提供Comparator,因此它期望添加的所有元素都是Comparable,但数组不是Comparable

使用the PriorityQueue constructor that takes a Comparator 提供您自己的Comparator&lt;String[]&gt;

【讨论】:

    【解决方案2】:

    PriorityQueue 的文档说得很清楚:

    优先级队列的元素根据它们的自然顺序进行排序,或者由队列构建时提供的 Comparator 排序,具体取决于使用的构造函数。优先级队列不允许null 元素。依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致ClassCastException)。

    您应该将Comparator&lt;String[]&gt; 实例传递给PriorityQueueappropriate constructor 以用于比较,因为String[] 无法按自然顺序进行比较。

    【讨论】:

      【解决方案3】:

      PriorityQueue 包含“根据其自然顺序或由队列构造时提供的比较器排序”的元素。尽管 Sting 对象具有自然排序,但字符串数组却没有。您需要在创建队列对象时提供一个 Comparator 对象,该对象可以说一个 String 数组大于或小于另一个 String 数组。

      【讨论】:

        【解决方案4】:

        您不能将String[] 添加到PriorityQueue,因为String[] 不是Comparable。解决方案取决于您真正需要完成的任务。

        对字符串进行排队

        使用 Queue 的 addAll() 方法。

        对字符串进行排队并保留分组

        将您的 String[] 对象放入 Queue 中。

        对字符串进行排队并保持优先级

        使用 PriorityQueue 的 addAll() 方法。

        对字符串进行排队、保留分组和保留优先级

        将您的String[] 包装在一个新类中。应用 Comparable 接口。实现compareTo()equals() 方法。在PriorityQueue 中排队您的自定义对象。

        【讨论】:

          猜你喜欢
          • 2013-07-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-13
          • 1970-01-01
          • 2015-01-13
          • 1970-01-01
          • 2015-02-13
          • 1970-01-01
          相关资源
          最近更新 更多