2015-05-23 4 views
2

Осторожно, у меня только один семестр под моим поясом. Попросив аналогичный вопрос только перенаправить на here, честно говоря, я не мог понять большую часть того, что было сказано, и это не было гигантской помощью.PriorityQueue.siftUpComparable? Что я здесь делаю неправильно?

Я сделал свой код немного более полно, как к тому, что происходит (я консолидированы все в основной метод. Что я думаю, что должно помочь немного.

Во всяком случае я получаю эту ошибку

Exception in thread "main" java.lang.ClassCastException: lab13d.Card cannot be cast to java.lang.Comparable 
at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:652) 
at java.util.PriorityQueue.siftUp(PriorityQueue.java:647) 
at java.util.PriorityQueue.offer(PriorityQueue.java:344) 
at java.util.PriorityQueue.add(PriorityQueue.java:321) 
at lab13d.Lab13d.main(Lab13d.java:53) 
Java Result: 1 
..

И не могу сделать головы, ни хвосты этого я никогда не использовал очереди, прежде чем так что это действительно очень ново для меня

Вот мой код:

public static void main(String[] args) 
{ 


    int players = 2; 
    Card[] pile; 
    int MAX_CARDS = 52; 
    int MAX_SUITS = 4; 
    int MAX_RANKS = 14; 




    pile = new Card[MAX_CARDS]; 
    int index = 0; 
    for(int suit = 1; suit <= MAX_SUITS; suit++){ 
     for(int rank = 2; rank <= MAX_RANKS; rank++, index++){ 
      Card c = new Card(suit, rank); 
      pile[index] = c; 

     } 
    }  


    PriorityQueue<Card>[] hand = new PriorityQueue[players + 1]; 
     for(int i = 0; i < players + 1; i++){ 
      hand[i] = new PriorityQueue(); 
     } 


    for(int i = 0; i < players; i++){ 
     for(int j = i; j < pile.length; j+= players){ 
      hand[i].add(pile[j]); 
     } 
    } 
    int leftOverCards = pile.length - (pile.length % players); 
    for(int i = leftOverCards; i < pile.length; i++){ 
     hand[players].add(pile[i]); 
    } 

    System.out.printf("%s", hand[0]); 

} 
+1

ответ по ссылке, которую они отправили, объясняет это очень хорошо; найти терпение, чтобы прочитать его через (заменив слово TreeSet на PriorityQueue всякий раз, когда он используется) –

ответ

2

Я предполагаю, что следующая строка бросает ClassCastException:

hand[i].add(pile[j]); 

Вы пытаетесь добавить экземпляр карты в PriorityQueue и, видимо, ваша карта не может быть приведен к сопоставимым. Вы должны пойти в файл Card.java и сделать класс реализации Сопоставимого интерфейса:

public class Card implements Comparable<Card>{ 
    ... 
    ... 
    ... 

Кроме того, необходимо реализовать метод CompareTo, я полагаю, что ваши карты будут сравниваться по их стоимости, и что объект Card имеет значение атрибута int от 2 (два) до 13 (туз). Если значения равны, мы можем сравнить их по своему усмотрению: я оставлю эту часть для себя:

@Override 
public int compareTo(Card o) { 
    int comparisonOutcome = ((Integer)o.getValue()).compareTo((Integer)this.getValue()); 
    if(comparisonOutcome == 1 || comparisonOutcome == -1){ 
     return comparisonOutcome; 
    else{ 
     // here values are equal, we can compare by card suit 
     // return -1, 1 or 0   
} 

Надеюсь, это поможет.

+0

Да, я думаю, это помогает, вы говорите, что мне нужен метод сравнения в классе Card, этот метод определяет способ сравнения двух разных карты. Хорошо, это имеет смысл, я планировал его реализовать позже, но почему именно это требуется? Кажется, что это не было бы чем-то необходимым для класса, который создает простую очередь? –

+0

Требуется PriorityQueue, для которого требуется, чтобы его содержимое было сравнимым. На основе сравнений он устанавливает приоритеты. Как объекты сравниваются, это зависит от вас. – Suspended

+0

Спасибо! это сработало отлично! –

Смежные вопросы