簡體   English   中英

Java優先級隊列可擴展嗎?

[英]Java priority queue that extends comparable?

我正在進行課堂作業,我不太明白如何在作業要求的方式中使用比較器。

作業內容為:

“完成優先級隊列類

  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?

好吧,因為你有一個隊列頭部的引用,從那里很簡單。 您有2種情況-

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

    • 在第一種情況下,您對Comparator :: compareTo感興趣。 根據優先級隊列的定義,您所要做的就是從頭開始遍歷隊列,並且只要enqueue(Item item)item enqueue(Item item)大於遍歷中的當前element ,就可以在element之前插入item 您將使用compare.compareTo(item, element)來確定它們的順序。

    • 在第二種情況下,您將僅使用item.compareTo(element)進行上述比較,遍歷和插入將相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM