2016-03-19 45 views
1

當我在android中運行我的程序時,出現以下例外。比較器的NoSuchMethodError?

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的好兼容替代品?

+0

'TurnComparator'的簽名是什麼?它執行 –

回答

4

如果你看一下Java文檔,你會看到有優先隊列中沒有這樣的構造:

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

您還需要specifify即

private PriorityQueue<Creature> turnqueue = new PriorityQueue<Creature>(5, new TurnComparator()); 
初始容量

更新:值得注意的是,這個工作在Java 8中 - 他們增加了一個額外的構造函數。 https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html

+0

是的,謝謝。我正在使用Java 8,這是它在我的桌面上運行的原因。我更好地將其切換到Java7,所以我所做的一切都與Android兼容。 – Madmenyo

+1

我編輯了我的答案,提到它在Java 8中起作用,因爲我沒有意識到這一點! – saml

0

ArrayList.sort()方法後來在API級別24中添加,這就是爲什麼它不起作用。可能有兩種解決方案,您可以更新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; 
      } 
     });