无法将对象添加到优先级队列

时间:2016-09-20 05:53:56

标签: java queue priority-queue

我需要将Jedi对象添加到队列中。我所知道的添加方法都没有工作,并且都给出了“找不到符号 - 方法添加(jedi1)。”我在上一堂课中没有太多关于队列的知识,所以我不确定我在做什么。其他需要注意的事项有3个具体内容。

1)修改堆操作以保持根中的最大值 - 而不是最小值 - 元素。请参阅算法的堆实验室分配。

2)使用具有不同大小限制的数组(如果< 10%利用率减少一半;如果已满,则减小一倍)。

3)使用类似的方法实现堆以接收任何通用对象。

4)使用以下规则允许重复值:如果输入重复值,则应将具有相似值的新元素视为优先级低于现有元素。

    public class PriorityQueue<JediQ>
    {
        Scanner reader = new Scanner(System.in);
        public void main(String[] args)
    {
       while (true)
    {
        System.out.println("Please select an option");
        System.out.println("1 - Add a Jedi ");
        System.out.println("2 - Remove an element");
        System.out.println("3 - Print head value");
        System.out.println("4 - Compare value to head value");
        System.out.println("5 - Print Array");
        System.out.println("6 - Exit");
        int x = 0;
        x = reader.nextInt();

        if (x == 1)
        {
            PriorityQueue<JediQ> line = new PriorityQueue<JediQ>();
            System.out.println("Enter the name of the Jedi");
            String Name = reader.next();
            System.out.println("Enter the midi count");
            double midi = reader.nextInt();

            Jedi jedi1 = new Jedi(Name, midi);

            line.add(jedi1);

            System.out.print("Jedi was added");
        }
        if (x == 6)
        {
            System.exit(0);
        }
    }
}

}

2 个答案:

答案 0 :(得分:2)

你的问题是缺乏对所有事情的基本知识;所以我给你一些开始的东西:

首先,该错误消息表示:您的实施PriorityQueue ... 具有add()方法。因为:你没写它!所以你从以下内容开始:

public class PriorityQueue<T> {
  public void add(T newElement) { ...

这导致了第二个主要问题:泛型类型的使用。正如您在我的示例中所看到的,您说:“我的队列类,应该接受任何类型的对象”。并且仅在稍后,实例化队列对象时;然后你声明这个实例应该是Jedis,比如:

PriorityQueue<Jedi> jedis = new PriorityQueue<>();
jedies.add(lukeSkywalkerHisUnknownCousin);

但是,当然,本练习中的真正的乐趣是优先级队列的实现,因此它提供了队列应具有的所有方法;并且他们按照您的任务中的规定工作!显然,这是你的任务,所以我将其作为练习留给读者!

最后提示:如果你想了解你应该实现的方法,你可以看一下java自己的PriorityQueue及其方法!

答案 1 :(得分:-1)

使用以下方法。

   line.offer(yourObject);

请阅读馆藏框架的基础知识。您可以从任何集合中添加/修改/删除对象,因为包装类已为此提供了方法。 例如。当你添加int(它变为Integer,因为集合只存储Object)。使用默认的Comparator。如下:

    public class PriorityQueueExample
    {
        public static void main(String[] args)
        {
            //Creating a PriorityQueue with default Comparator.

            PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>();

            //Inserting elements into pQueue.

            pQueue.offer(21);

            pQueue.offer(17);

            //Removing the head elements

            System.out.println(pQueue.poll()); 

要在任何集合中添加自定义对象,您需要使用Comparator或Comparable。

   class JediQ
        {
            String name;

            int midi;

            //Constructor Of JediQ

            public JediQ(String name, int midi)
            {
                this.name = name;

                this.midi = midi;
            }

            @Override
            public String toString()
            {
                return name+" : "+midi;
            }
        }

   and then adding the object as below:

            class MyComparator implements Comparator<JediQ>
        {
            @Override
            public int compare(JediQ e1, JediQ e2)
            {
                return e1.name - e2.name;
            }
        }


        MyComparator comparator = new MyComparator();

        PriorityQueue<JediQ> pQueue = new PriorityQueue<JediQ>(7, comparator);
        pQueue.offer(new JediQ("AAA", 150));