比较器的NoSuchMethodError?

时间:2016-03-19 15:33:29

标签: java android libgdx

当我在android中运行我的程序时,我在这一行得到了以下异常。

private PriorityQueue<Creature> turnqueue = new PriorityQueue<Creature>(new TurnComparator());

FATAL EXCEPTION: GLThread 18092
Process: com.buckriderstudio.clonequest, PID: 10171
java.lang.NoSuchMethodError: No direct method <init>(Ljava/util/Comparator;)V in class Ljava/util/PriorityQueue; or its super classes (declaration of 'java.util.PriorityQueue' appears in /system/framework/core-libart.jar)

这是我的比较器的样子:

public class TurnComparator implements Comparator<Creature> {    
    @Override
    public int compare(Creature c1, Creature c2) {
        if (c1.getNextMove() < c2.getNextMove()) return -1;
        if (c1.getNextMove() > c2.getNextMove()) return 1;
        else return 0;
    }   
}

这似乎是某种兼容性问题,但我不知道如何解决这个问题。 Android根本不支持Comparator,还是需要更改一下才能修复此问题?什么是比较PriorityQueue

的良好兼容替代品

2 个答案:

答案 0 :(得分:4)

如果你看一下java文档,你会发现优先级队列没有这样的构造函数:

https://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html

您还需要指定初始容量,即

private PriorityQueue<Creature> turnqueue = new PriorityQueue<Creature>(5, new TurnComparator());

更新:值得注意的是,这可以在Java 8中运行 - 他们添加了一个额外的构造函数。 https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html

答案 1 :(得分:0)

稍后在API级别24中添加了ArrayList.sort()方法,这就是它无法正常工作的原因。可能有两种解决方案,您可以更新java版本,也可以使用以下方法。

 Collections.sort(yourList, new Comparator<Creature>() {
            @Override
            public int compare(Creature c1, Creature c2) {
                if (c1.getNextMove() < c2.getNextMove()) return -1;
                if (c1.getNextMove() > c2.getNextMove()) return 1;
                else return 0;
            }
        });