无法在我的队列<string []> </string []>中放置String []对象

时间:2014-02-28 18:17:44

标签: java queue priority-queue


我收到此错误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&lt;&gt;。

4 个答案:

答案 0 :(得分:4)

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

来自PriorityQueue javadocs

  

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

您尚未提供Comparator,因此预计所有添加的元素都为Comparable,但数组不是Comparable

使用the PriorityQueue constructor that takes a Comparator提供您自己的Comparator<String[]>

答案 1 :(得分:2)

PriorityQueue的文档明确指出:

  

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

您应该将Comparator<String[]>个实例传递给将用于比较的PriorityQueueappropriate constructor,因为String[]无法按自然顺序进行比较。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

对字符串进行排队

使用队列的addAll()方法。

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

将您的String[]个对象排入Queue

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

使用PriorityQueue的addAll()方法。

对字符串进行排队,保留分组并保留优先级

将您的String[]包裹在新课程中。应用Comparable接口。实施compareTo()equals()方法。将您的自定义对象排在PriorityQueue