gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:36:08 25 4
gpt4 key购买 nike

[解决了]

我是一个学习 Java 的 C++ 人(希望)是为了一份即将到来的工作。因此,我正在自己练习在 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(..),但是我的迭代器当然不是数据,因此对它一无所知相比于()。

最佳答案

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

我建议您阅读 LinkedList、ArrayList 和 TreeSet 的源代码,以了解它们是如何在 JDK 中实现的。我还建议您阅读 java.lang. 中所有类和接口(interface)的源代码。和 java.util.
您想让 Node 与其他节点具有可比性,并且您的数据类型也需要具有可比性。您还应该使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com