无法将 String[] 对象放在我的队列<字符串[]中>




我收到此错误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<>。

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

来自PriorityQueue javadocs:

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

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

使用采用ComparatorPriorityQueue构造函数提供您自己的Comparator<String[]>

PriorityQueue的文档清楚地表明:

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

应将Comparator<String[]>实例传递给将用于比较的PriorityQueue的相应构造函数,因为无法在自然排序上比较String[]

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

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

对字符串进行排队

使用队列的addAll()方法。

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

String[]对象排入Queue

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

使用 PriorityQueue 的 addAll() 方法。

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

将您的String[]包装在新类中。 应用可比较的界面。实现compareTo()equals()方法。将自定义对象排入PriorityQueue 中。

最新更新