【问题标题】:Java priority queue that extends comparable?扩展可比的Java优先级队列?
【发布时间】:2019-03-16 17:46:00
【问题描述】:

我正在做一个课堂作业,但我不太明白如何按照作业要求的方式使用比较器。

作业内容如下:

"完成优先队列类

  1. 您的优先级队列必须使用匿名函数来决定优先级
  2. 必须将 Function 接口作为构造函数的参数
  3. 您应该仍然有默认构造函数 - 如果没有提供函数,请使用类的 compareTo 函数"

这是我正在学习的课程...

public class PriorityQueue <Item extends Comparable<Item>> {

    public PriorityQueue()
    {

    }
    public PriorityQueue(Comparator<Item> compare )
    {

    }  

    private int size = 0;
    private Node<Item> head = null;
    private Comparator<Item> compare ;

    private static class Node<Item>
    {
       private Item data;
       private Node<Item> next;


    public Node(Item data, Node<Item> next)
       {
          this.data = data;
          this.next = next;
       }       
       public Node(Item data)
       {
          this.data = data;
          this.next = null;
       }       
       public Node()
       {
          this.data = null;
          this.next = null;
       }
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public Item dequeue() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void enqueue(Item item) {
        Node<Item> curr = head;
        Node<Item> prev = curr;

        if (isEmpty())
        {
            head = new Node<Item>(item,null);
        }
        else
        {
            while (curr != null)
            {
                prev = curr;
                curr = curr.next;
            }

            prev.next = new Node<Item>(item, curr);
        }
        size++;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public void printQueue() {
        Node<Item> curr = head;

        while (curr != null)
        {
            System.out.println(curr.data);
            curr = curr.next;
        }

    }
}

这是队列将包含的进程类...

public class Process implements Comparable<Process> {

    private ProcessPriorty priority;
        private String name;

    public Process(ProcessPriorty priority, String name) {
        super();
        this.priority = priority;
        this.name = name;
    }

    public void setPriority(ProcessPriorty priority) {
        this.priority = priority;
    }

    @Override
    public String toString() {
        return name + "... Priority = " + priority + ".";
    }

    public String getName() {
        return name;
    }

    public ProcessPriorty getPriority() {
        return priority;
    }

    @Override
    public int compareTo(Process other) {

        if(other == null)
        {
            return  1;
        }
        return this.priority.compareTo(other.priority) ;
    }
}

我了解队列的概念,甚至将 enqueue 方法编码为一个简单的队列,当项目进入时插入它们。我遇到的问题是比较该方法中的节点以对列表进行排序插入时优先。我认为这与作业的这三个方向有关。那么,我应该如何处理构造函数、Comparator 变量以及如何使其默认为 compareTo?

【问题讨论】:

  • 它必须将 Function 接口作为构造函数的参数:您的类采用 Comparator。所以这是不正确的。查看比较器 javadoc。它有一种方法可以使用要比较的元素的自然顺序来创建 Comparator。它还有一个通过委托给一个函数来创建一个比较器,将项目转换为可比较对象。
  • 课程由我的教授组织。所以基本上这个类看起来是一样的,除了方法是空白的。然后我们必须尝试拼凑他的计划。你是说他预先写好的构造函数参数不正确?
  • 不,这是不正确的,因为它不遵守说明。顺便说一句,Java 中甚至不存在匿名函数。请老师澄清。但是无论如何,如果 Comparator 实际上是参数类型应该是什么,那么您只需要使用该比较器。有什么问题?同样,对于 noarg 构造函数,请查看 Comparator 的 javadoc:它有一个方法可以使用要比较的元素的自然顺序来创建 Comparator。
  • @JBNizet 我认为这些问题是正确的。它似乎在要求 lambda,即匿名函数,而 Comparator&lt;T&gt; 是一个函数式接口。
  • @Ryotsu 实际上现在 Java 中有一个 Function,但我同意这些说明似乎有误,而是需要 Comparator。 OP 应与他们的导师澄清。 Function : docs.oracle.com/javase/10/docs/api/java/util/function/…

标签: java linked-list priority-queue comparable enqueue


【解决方案1】:

好吧,既然您有对队列头部的引用,那么从那里开始就很简单了。您有 2 个案例 -

  1. compare != null
  2. compare == null

    • 在第一种情况下,您对Comparator::compareTo 感兴趣。从优先级队列的定义来看,只要从头开始遍历队列,只要遍历中enqueue(Item item)中的item大于当前element,就插入itemelement 之前。您将使用compare.compareTo(item, element) 来确定它们的顺序。

    • 在第二种情况下,您只需使用item.compareTo(element) 进行上述比较,遍历和插入将是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多