java - 在Java中创建通用有序链表,使用compareTo()时遇到问题

标签 java inheritance linked-list operator-overloading

[已解决]

我是一名 C++ 人员,正在学习 Java(希望)是为了一份即将到来的工作。因此,我正在练习自己用 Java 实现链表。我完成了一个标准的双向链表的实现,它工作得很好。然而,我随后尝试创建一个有序链接列表,并意识到无法重载“<”运算符将是一个严重的问题。

我已经浏览了这个网站上其他人的问题,但我仍然无法理解,所以我想我应该发布我的代码并获得更适合我正在做的事情的答案。

开始..

链表类:

public class MyList<T>  {

/*** ~Public Interface~ ***/
       //insert, delete, size, print, etc.
       ...

    /*** Private Data Members ***/
       //node begin, end, T data
   ....


/** Private node class **/
//Represents the nodes in the list
private class node implements Comparable<T>{ //Don't know if this is right
    node next;
    node prev;
    T    data;

    node(node p, node n, T d){
        next = n;
        prev = p;
        data = d;
    }

    @Override
    public int compareTo(T o) {
        return (data <= o ? 1 : 0); //Get an error still here
    }

          /** Iterator **/
               //iterator class
}

有序链表类:

public class OrderedList<T> extends MyList<T> implements Comparable<T>{ //Pretty sure this is wrong

public void insert(T d){
    if(empty()){
        push_front(d);
    } else {
        MyList<T>.MyListIter it = begin();
        int i = 0;
             //This won't work obviously
        for(; i < size() || it.current().compareTo(it.next()) == -1; ++i, it.next()){
                    //find node to place the new node before it 
                        it.prev() //Need to go back one since we went forward in the loopcheck.


        }
    }
}

这里真是不知所措。如何实现类似于运算符重载的功能,以便我可以完成这个有序列表的实现?

我也在尝试掌握 Java 中的继承,因此,如果您发现这方面有问题,也请随时提出意见。

谢谢大家。

更新:

好的,我做了我认为必须做的更改,但仍然遇到错误。这是新代码:

MyList 类中的节点类:

private static class node<T> implements Comparable<T>{
    node<T> next;
    node<T> prev;
    T    data;

    node(node<T> p, node<T> n, T d){
        next = n;
        prev = p;
        data = d;
    }

    public int compareTo(T o) {
        return ((Comparable<T>) this.data).compareTo(o);
    }

}

有序列表:

公共(public)类 OrderedList> 扩展 MyList{

compareTo 的用法:

if(((Comparable<T>) it).compareTo(it.next()) == -1) found = true;

编译器强制我进行这些转换,现在错误是:

MyList$MyListIter cannot be cast to java.lang.Comparable

列表迭代器类如下所示:

public class MyListIter{

它位于 MyList 内。

编辑[已解决]

当我使用迭代器时,我不是使用 it.current() 来访问实际数据,而是使用 it.compareTo(..),但当然我的迭代器不是数据,因此不会了解有关compareTo() 的任何信息。

最佳答案

虽然这作为一种练习很好,但我不会雇用这样的人:a)更喜欢使用自己的 LinkedList 而不是内置的 LinkedList b)当存在排序集合时使用 LinkedList 作为排序集合,而 ArrayList 更有效对于这种这样的..;)

我建议您阅读 LinkedList、ArrayList 和 TreeSet 的源代码,以了解它们在 JDK 中的实现方式。我还建议您阅读 java.lang.java.util.

中所有类和接口(interface)的源代码

您希望使节点与其他节点具有可比性,并且您还需要您的数据类型具有可比性。您还应该使用 Java 代码约定。

public class MyList<T extends Comparable<T>> {

static class Node {
    Node prev, next;
    T    data;

    Node(Node p, Node n, T d){
        next = n;
        prev = p;
        data = d;
    }
}

public void insert(T d){
    if(empty()){
        push_front(d);
        return;
    }
    for (Node<T> node = first;node.next != null; node = node.next) {
       // if less than we need to insert before.
       if (d.compareTo(node.data) < 0) {
          if (node == first) {
              first = new Node(null, first, d);
              node.prev = first;
          } else {
              node = new Node(node.prev, node, d);
              node.prev.next = node;
          }
          return;
       }

关于java - 在Java中创建通用有序链表,使用compareTo()时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11905380/

相关文章:

java - 通用链表删除、大小、获取方法

c - 我的循环链表不显示最后一个节点

java - 我有一个死锁同步,请帮助启动循环周期

java - 如何通过http获取xml文件?

C++ 组合——我必须包装所有这些函数吗?

c++ - 为什么我们需要将函数声明复制并粘贴到继承的类头中

java - "Activity has leaked window... that was originally added."视频加载失败导致

java - 使用设计模式将工作顺序与实现分开

objective-c - Objective C - 如何从另一个类继承?

c# - 新建具有非常大初始容量的 List<T> 并填充它与简单地填充 LinkedList<T> 的性能