Sarfraz
Sarfraz

Reputation: 67

What is the error in the following Java-code?

    import java.util.*;
    class Huffman  {
        int a;
        public Huffman(int i)
        {
            a = i;
        }               
    }

    class PriorityQueueDemo implements Comparator<Huffman>
    {
        public int compare(Huffman ab, Huffman cd)
        {
            if(ab.a>cd.a)
            {
                return 1;

            }
            return 0;
        }

        public static void main(String[] args)  
        {
            PriorityQueue<Huffman> HuffQueue = new PriorityQueue<Huffman>();

            Huffman ab = new Huffman(10);
            HuffQueue.offer(ab);
            ab = new Huffman(50);
            HuffQueue.offer(ab);
            ab = new Huffman(20);
            HuffQueue.offer(ab);
            ab = new Huffman(60);
            HuffQueue.offer(ab);


            while(HuffQueue.size() > 0)
                   System.out.println(HuffQueue.remove());

            }
    }

What is wrong with the following Code! It generates the following exception:

Exception in thread "main" java.lang.ClassCastException: Huffman cannot be cast to java.lang.Comparable
    at java.util.PriorityQueue.siftUpComparable(Unknown Source)
    at java.util.PriorityQueue.siftUp(Unknown Source)
    at java.util.PriorityQueue.offer(Unknown Source)
    at PriorityQueueDemo.main(Huffman.java:34)

Upvotes: 0

Views: 1828

Answers (2)

David Oliv&#225;n
David Oliv&#225;n

Reputation: 2725

Exception states Hufmannclass is not Comparable, does not implement java.util.Comparable, as required by the PriorityQueue. Implement Comparable into Huffman in order to be comparable and get proper priority onto queue. Comparable is explained in http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html and requires a compareTo(T o) : int method implementation.

Upvotes: 0

Jigar Joshi
Jigar Joshi

Reputation: 240996

You need to implement Comparable interface

A priority queue relying on natural ordering also does not permit insertion of non-comparable objects (doing so may result in ClassCastException).

Or you need to pass comparator in constructor

public PriorityQueue(int initialCapacity, Comparator<? super E> comparator)

like as follows

PriorityQueue<Huffman> HuffQueue = new PriorityQueue<Huffman>(10, new Comparator<Huffman>(){

@Override
public int compare(Huffman ab, Huffman cd){
            if(ab.a>cd.a)
            {
                return 1;

            }
            return 0;
}
});

Upvotes: 4

Related Questions