Java:通用 T 对象的 compareTo
Java: compareTo for generic T objects
我有以下代码,如何使用基本类型的 compareTo 方法:
public class mySortertedList<T extends Comparable<T>> extends myLinkedList<T> {
class Node {
Node next = null;
T data;
Node (T x) {
data = x;
}
}
public int compareTo (T Obj) {
return this.compareTo(Obj);
}
基本上我拥有的是一个排序链表,它根据 compareTo 方法向列表中添加值。我如何确保 compareTo 适用于基本类型,至少适用于整数?非常感谢任何帮助!
编辑:为了澄清,这里有更多代码:
主程序:
public static void main(String[] args) {
newList.addTo(4);
newList.addTo(1337);
newList.addTo(30);
newList.addTo(15);
}
我还有其他方法,如 get(int index)、remove(),即删除列表中的最后一个元素。这里是 mySortertList class 的 addTo 方法,有一个 Node 类型的变量 start 的声明,它实际上只是一个指针作为起点来逐一遍历整个链表:
private Node start = null;
public void addTo(T x) {
Node newNode = new Node(x);
Node pointer = start;
if (start == null) {
start = newNode;
} else if (size()==1){
if (newNode.data.compareTo(start.data)<0) {
newNode.next= start;
start = newNode;
} else {
start.next= newNode;
}
} else {
boolean valuePlaced= false;
Node pointer2= start.next;
while (pointer2 !=null) {
if (newNode.data.compareTo(pointer.data)<0) {
newNode.next= start.next;
start.next = newNode;
valuePlaced = true;
} else if (newNode.data.compareTo(pointer2.data)<0) {
pointer = newNode;
new.next= pointer2;
valuePlaced = true;
}
pointer = pointer.next;
pointer2 = pointer2.next;
}
if (valuePlaced == false) {
pointer.next= newNode;
}
}
}
所有情况都使用 compareTo
。
Integer
是 class, 不是 原语。 int
是原始类型,但不能出现在泛型中。您不需要做任何特别的事情,只需使用 compareTo
,它在 Integer
.
上运行良好
不可能 obj
是原始的(在当前版本的 Java 中)。 obj
永远是一个对象。
我不知道我是否让你好,但这是我可以建议你的:
- 假设
compareTo()
在 class 节点中... (**)
- 我用
LinkedList<T>
而不是你的 myLinkedList<T>
进行了测试
以下在我这边工作正常。
// we are in file Test.java
public class Test {
public static void main(String... args) {
mySortertedList<Integer> newList = new mySortertedList<>();
newList.addTo(4);
newList.addTo(1337);
System.out.println("newList "+ newList.toString()); // newList , 4, 1337
newList.addTo(30);
System.out.println("newList "+ newList.toString()); // newList , 4, 30, 1337
newList.addTo(15);
System.out.println("newList "+ newList.toString()); // newList , 4, 15, 30, 1337
}
}
class mySortertedList<T extends Comparable<T>> extends LinkedList<T> { // rather than your myLinkedList<T>
private Node start = null;
class Node {
Node next = null;
T data;
Node(T x) {
data = x;
}
public int compareTo(T Obj) { // (**)
if ((Object) Obj.getClass().getName() == "java.lang.Integer") {
return Integer.compare((Integer) this.data, (Integer) Obj);
} else {
return this.compareTo(Obj);
}
}
}
public String toString() {
String s = "";
Node pointer2= start;
while (pointer2 !=null) {
s += ", "+ pointer2.data.toString();
pointer2 = pointer2.next;
}
return s;
}
public void addTo(T x) {
Node newNode = new Node(x);
Node pointer = start;
if (start == null) {
start = newNode;
} else if (start.next == null) { // (size()==1){
if (newNode.data.compareTo(start.data)<0) {
newNode.next= start;
start = newNode;
} else {
start.next= newNode;
}
} else {
boolean valuePlaced= false;
if (newNode.data.compareTo(start.data)<0) {
newNode.next= start;
start = newNode;
}
else {
while (valuePlaced == false && pointer.next != null) {
if (newNode.data.compareTo(pointer.next.data) < 0) {
newNode.next = pointer.next;
pointer.next = newNode;
valuePlaced = true;
break;
}
pointer = pointer.next;
}
if (valuePlaced == false) {
pointer.next = newNode;
}
}
}
}
}
要进行测试,只需创建一个 Test.java 并复制粘贴此代码。
我有以下代码,如何使用基本类型的 compareTo 方法:
public class mySortertedList<T extends Comparable<T>> extends myLinkedList<T> {
class Node {
Node next = null;
T data;
Node (T x) {
data = x;
}
}
public int compareTo (T Obj) {
return this.compareTo(Obj);
}
基本上我拥有的是一个排序链表,它根据 compareTo 方法向列表中添加值。我如何确保 compareTo 适用于基本类型,至少适用于整数?非常感谢任何帮助!
编辑:为了澄清,这里有更多代码: 主程序:
public static void main(String[] args) {
newList.addTo(4);
newList.addTo(1337);
newList.addTo(30);
newList.addTo(15);
}
我还有其他方法,如 get(int index)、remove(),即删除列表中的最后一个元素。这里是 mySortertList
private Node start = null;
public void addTo(T x) {
Node newNode = new Node(x);
Node pointer = start;
if (start == null) {
start = newNode;
} else if (size()==1){
if (newNode.data.compareTo(start.data)<0) {
newNode.next= start;
start = newNode;
} else {
start.next= newNode;
}
} else {
boolean valuePlaced= false;
Node pointer2= start.next;
while (pointer2 !=null) {
if (newNode.data.compareTo(pointer.data)<0) {
newNode.next= start.next;
start.next = newNode;
valuePlaced = true;
} else if (newNode.data.compareTo(pointer2.data)<0) {
pointer = newNode;
new.next= pointer2;
valuePlaced = true;
}
pointer = pointer.next;
pointer2 = pointer2.next;
}
if (valuePlaced == false) {
pointer.next= newNode;
}
}
}
所有情况都使用 compareTo
。
Integer
是 class, 不是 原语。 int
是原始类型,但不能出现在泛型中。您不需要做任何特别的事情,只需使用 compareTo
,它在 Integer
.
不可能 obj
是原始的(在当前版本的 Java 中)。 obj
永远是一个对象。
我不知道我是否让你好,但这是我可以建议你的:
- 假设
compareTo()
在 class 节点中... (**) - 我用
LinkedList<T>
而不是你的myLinkedList<T>
进行了测试
以下在我这边工作正常。
// we are in file Test.java
public class Test {
public static void main(String... args) {
mySortertedList<Integer> newList = new mySortertedList<>();
newList.addTo(4);
newList.addTo(1337);
System.out.println("newList "+ newList.toString()); // newList , 4, 1337
newList.addTo(30);
System.out.println("newList "+ newList.toString()); // newList , 4, 30, 1337
newList.addTo(15);
System.out.println("newList "+ newList.toString()); // newList , 4, 15, 30, 1337
}
}
class mySortertedList<T extends Comparable<T>> extends LinkedList<T> { // rather than your myLinkedList<T>
private Node start = null;
class Node {
Node next = null;
T data;
Node(T x) {
data = x;
}
public int compareTo(T Obj) { // (**)
if ((Object) Obj.getClass().getName() == "java.lang.Integer") {
return Integer.compare((Integer) this.data, (Integer) Obj);
} else {
return this.compareTo(Obj);
}
}
}
public String toString() {
String s = "";
Node pointer2= start;
while (pointer2 !=null) {
s += ", "+ pointer2.data.toString();
pointer2 = pointer2.next;
}
return s;
}
public void addTo(T x) {
Node newNode = new Node(x);
Node pointer = start;
if (start == null) {
start = newNode;
} else if (start.next == null) { // (size()==1){
if (newNode.data.compareTo(start.data)<0) {
newNode.next= start;
start = newNode;
} else {
start.next= newNode;
}
} else {
boolean valuePlaced= false;
if (newNode.data.compareTo(start.data)<0) {
newNode.next= start;
start = newNode;
}
else {
while (valuePlaced == false && pointer.next != null) {
if (newNode.data.compareTo(pointer.next.data) < 0) {
newNode.next = pointer.next;
pointer.next = newNode;
valuePlaced = true;
break;
}
pointer = pointer.next;
}
if (valuePlaced == false) {
pointer.next = newNode;
}
}
}
}
}
要进行测试,只需创建一个 Test.java 并复制粘贴此代码。