当前位置: 首页 > 知识库问答 >
问题:

使用嵌套在另一个类中的类重写CompareTo方法,该类扩展了可比较

孙朗
2023-03-14

我的任务是在Java中编写我自己的PriorityQueue类。它基于LinkedList。引用说明:

存储在节点中的数据类型应该是可比较的通用类型。这是为类声明编写的:public class PriorityQueue(E)-

我将使用PriorityQueue来编写另外两个类,一个是患者类型的,另一个是waitingRoom类型的。这就是比较方法发挥作用的地方,因为我将这两个类排序为它们各自的PriorityQueue。

我一直在PriorityQueue类内部定义ListNode类,所以我在一个类中有一个类。现在问题来了:

我将在哪里实现/重写从Comparable继承的compareTo方法?

它无法在PriorityQueue类中实现,因为compareTo只能接受一个参数。然而,这似乎是它应该去的地方,因为这是实际的类。

如果我在ListNode类中实现它,我不知道该如何实现。我要把ListNode变成一个接口吗?抽象课堂?

下面是我写的相当新手的代码谢谢帮助

    package hostpitalQueue;

import java.util.AbstractList;

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

    private ListNode front;

    public PriorityQueue() {
        front = null;
    }
    public PriorityQueue(ListNode n1) {
        front = n1;
    }



    //method for addingNode to beginning, 
    //perhaps overload method for next nodes?
    public void addNode(ListNode n1) {

        if(front == null) {
            front = n1;
        }else {
                //need to find last node and add n1 to it
                ListNode lastNode = findLastNode(n1);
                lastNode.addNode(n1);
            }
    }



    //need to compare, remember, this is a priorityqueue
    public ListNode findLastNode(ListNode n) {
        //compare the data of both
        //compare to front

        ListNode n1 = front;
        int i = n1.compareTo(n);
        //only do something here if n is higher priority
        if(i > 0) {
            E frontData = n1.data;
            E nodesData = n.data;
            ListNode holder = n1;
            front = n;
            n.next = holder;
            holder.previous = n;
        }else if(n1.next == null) {
            n1.next = n;
            n.previous = n1;
        }
        else {

            while(front.next != null) {
                n1 = front.next;
                //is n1 a higher priority?
                Integer ii = n1.compareTo(n);
                if(ii > 0) {
                    //this means that we should return the previous node, to insert
                    //before this one
                    return n1.previous;
                }
            }
        }
        return n1;
    }


    public class ListNode  {
        //contains a left and a right, as well as a data field
        public E data;
        public ListNode previous,next;


        //construct
        public ListNode() {
            data = null;
            previous = null;
            next = null;
        }

        //previous to next
        public ListNode(E data) {
            this.data = data;
            previous = null;
            next = null;
        }

        public ListNode(E data,ListNode n1) {
            this.data = data;
            previous = n1;
            next = null;
        }

        public ListNode(E data,ListNode n1,ListNode n2) {
            this.data = data;
            previous = n1;
            next = n2;
        }

        public void addNode(ListNode n1) {
            //gotta check if my next is null
            ListNode holder = null;
            if(this.next != null) {
                holder = this.next;
            }
            this.next = n1;
            n1.previous = this;
            n1.next = holder;
        }
        public int compareTo(ListNode n1) {
            return 0;
        }

        public void printMe() {
            System.out.println(this.data);
        }

    }







}

共有2个答案

许寒
2023-03-14

如果要比较两个ListNodes,如第行所示:

n1.compareTo(n)

您需要使其实现可比性:

public class ListNode implements Comparable<ListNode> {

并实现compareTo方法,如下所示:

return this.data.compareTo(that.data);

(因为您知道数据可比的)。但您必须处理空数据的情况。

请注意,您还应该将顶级类上的类型变量声明为:

<E extends Comparable<? super E>>
邬博涉
2023-03-14

将用作PriorityQueue元素类型的每个类都必须实现Comparable接口和compareTo方法。

请注意,由于您的ListNode类实现了compareTo方法,您可以让它实现Comparable

public class ListNode implements Comparable<ListNode>  {

...

    @Override
    public int compareTo(ListNode n1) {
        return data.compareTo(n1.data);
    }

请注意,由于ListNodeclasse不依赖于PriorityQueue的实例,因此可以将其设置为static;在这种情况下,您必须声明一个通用参数

public static class ListNode<T extends Comparable<T>>
        implements Comparable<ListNode<T>>  {
    //contains a left and a right, as well as a data field
    public T data;
    public ListNode<T> previous,next;


    //construct
    public ListNode() {
        data = null;
        previous = null;
        next = null;
    }

    //previous to next
    public ListNode(T data) {
        this.data = data;
        previous = null;
        next = null;
    }

    public ListNode(T data,ListNode<T> n1) {
        this.data = data;
        previous = n1;
        next = null;
    }

    public ListNode(T data,ListNode<T> n1,ListNode<T> n2) {
        this.data = data;
        previous = n1;
        next = n2;
    }

    public void addNode(ListNode<T> n1) {
        //gotta check if my next is null
        ListNode<T> holder = null;
        if(this.next != null) {
            holder = this.next;
        }
        this.next = n1;
        n1.previous = this;
        n1.next = holder;
    }

    @Override
    public int compareTo(ListNode<T> n1) {
        return data.compareTo(n1.data);
    }

    public void printMe() {
        System.out.println(this.data);
    }
}

ListNode有字段,所以不能将其更改为接口(为什么要这么做?)

你或许应该问问自己,你是否真的需要一个双链接列表,而单链接列表是不够的。

您的问题中不清楚您是否需要实现一个链表,或者您是否可以使用类LinkedList,在这种情况下,您不需要ListNode类:PriorityQueue只会封装一个LinkedList

 类似资料:
  • 问题内容: 我正在学习Java,并且希望将自己的课堂变成可观察的课堂。 但是我已经有了它扩展了另一个类。 我该怎么办? 问题答案: 我建议避免完全使用该类,而应 定义事件特定的侦听器和相应的事件定义 。然后在您的类中定义一个侦听器列表,以及添加和删除侦听器以及向其传播事件的方法(请参见下文)。 强制您使用它来表示事件,然后使用来检查事件类型,这是一种丑陋的非OO方法,并使代码更难以理解。如果查看j

  • 问题内容: 因此,可以说我正在尝试使用从类中获取方法。 但是该类正在扩展另一类,即带有方法的类。我不太确定这是否会使它抛出异常。 我知道正在扩展的类具有getFile方法。对不起,如果我听起来混乱,有点累。 问题答案: 听起来您只需要使用而不是即可。整个要点是,它 仅 查找在您要对其调用的类中声明的方法: 返回一个Method对象,该对象反映此Class对象表示的类或接口的指定声明方法。 鉴于:

  • 我被要求创建一个主方法,允许我创建一个狼对象、鹦鹉对象和犀牛对象,我已经为这些动物中的每一个创建了类,他们扩展了抽象类动物,其中包含一个抽象方法makeNoise()。我已经在我的犀牛、鹦鹉和狼类中实现了这个抽象方法,该方法包含一个System.out.println函数和与这些动物中的每一个相关的噪声。例如,我的鹦鹉类(扩展动物)包含一个方法makeNoise(),它打印出“Squawk”。 我

  • 我是OOPs新手,如果这听起来很基本,我很抱歉。我有一个具有以下代码的类:- 现在假设我在同一个包中有另一个类“Main”。有什么方法我可以创建一个类的对象'内部'在'主'与类'外部'参考? 我尝试了以下操作(这是抛出错误):- “Main”和“Outer”类都在同一个包中。另外,我的主要目标是了解是否有任何方法可以在main方法中创建类Inner的对象,如下所示:-outerO1=newinne

  • 该类包含: > 一个无参数构造函数,用于创建具有指定边1、边2和边3的三角形。 所有三个数据字段的访问器方法。 名为getArea()的方法,该方法返回此三角形的区域。 一个名为GetPermission()的方法,返回此三角形的周长。 *一个名为toString()的方法,返回三角形的字符串描述。 有关计算三角形面积的公式,请参见编程练习2.15(java编程入门第9版)。toString()方

  • 使用java和testNG,我在两个不同的类test1.class和test2.class中有两个测试,还有一个包含大多数方法的base.class: