如何对Java中的自定义泛型类型链表进行排序?
我正在用java编写属于泛型类型的自己的链表,而不是使用java集合链表。链表的添加方法由以下代码组成:如何对Java中的自定义泛型类型链表进行排序?,java,sorting,linked-list,compare,Java,Sorting,Linked List,Compare,我正在用java编写属于泛型类型的自己的链表,而不是使用java集合链表。链表的添加方法由以下代码组成: public void add(T item, int position) { Node<T> addThis = new Node<T>(item); Node<T> prev = head; int i; if(position <= 0) { System.out.println("Error: Cannot add
public void add(T item, int position) {
Node<T> addThis = new Node<T>(item);
Node<T> prev = head;
int i;
if(position <= 0) {
System.out.println("Error: Cannot add element before position 1.");
}
else if(position == 1) {
addThis.setNext(head);
head = addThis;
} else {
for(i = 1; i < position-1; i++) {
prev = prev.getNext();
if(prev == null) {
System.out.println("Cannot add beyond end of list");
}
} // end for
addThis.setNext(prev.getNext());
prev.setNext(addThis);
}
} // end add
public void add(T项,int位置){
Node addThis=新节点(项);
节点prev=头部;
int i;
如果(position您提到使用泛型,但随后提到按字母顺序对它们进行排序。泛型不一定是字符串,它们用于表示任何类型,而类似于字母顺序的排序属性意味着字母字符。我的回答假设您期望类型为T
的泛型对象具有字母nat在我的示例中,我专门使用字符串
您可以将代码设置为搜索要添加的位置,而不是提供该位置
public void add(T item) {
Node<T> addThis = new Node<T>(item);
Node<T> itr = head;
while (itr.hasNext()) {
if (addThis.compareTo(itr.getNext()) <= 0) { // itr > addThis
addThis.setNext(itr.getNext());
itr.setNext(addThis);
return;
}
itr = itr.getNext();
}
addThis.setNext(null);
itr.setNext(addThis);
return;
} // end add
为了使用简单的泛型实现这一点,您需要使用类型T
实现Comparable
实现Node
类,如下所示:
class NodeNode<T extends Comparable<T>> implements Comparable {
T value;
@Override
public int compareTo(Node otherNode) {
return this.getValue().compareTo(otherNode.getValue());
}
// OTHER CLASS CONSTRUCTORS, VARIABLES, AND METHODS
}
类节点节点实现了可比较的{
T值;
@凌驾
公共整数比较(节点其他节点){
返回这个.getValue().compareTo(otherNode.getValue());
}
//其他类构造函数、变量和方法
}
您的实现是否扩展了java.util.List接口
您可以简单地将对象添加到列表中,然后使用Collections.sort()对列表进行排序吗?我最终通过使用插入排序解决了这个问题:
public void add(Dvd item) {
DvdNode addThis = new DvdNode(item);
if(head == null) {
head = addThis;
} else if(item.getTitle().compareToIgnoreCase(head.getItem().getTitle()) < 0) {
addThis.setNext(head);
head = addThis;
} else {
DvdNode temp;
DvdNode prev;
temp = head.getNext();
prev = head;
while(prev.getNext() != null && item.getTitle().compareToIgnoreCase
(prev.getNext().getItem().getTitle()) > 0) {
prev = temp;
temp = temp.getNext();
}
addThis.setNext(temp);
prev.setNext(addThis);
}
}
公共作废添加(Dvd项){
DvdNode addThis=新的DvdNode(项目);
if(head==null){
head=addThis;
}else if(item.getTitle().compareTignoreCase(head.getItem().getTitle())<0){
addThis.setNext(head);
head=addThis;
}否则{
节点温度;
DvdNode-prev;
temp=head.getNext();
prev=头部;
while(prev.getNext()!=null&&item.getTitle().compareTignoreCase
(prev.getNext().getItem().getTitle())>0){
prev=温度;
temp=temp.getNext();
}
addThis.setNext(temp);
上一个设置下一个(添加此);
}
}
No它不使用java集合链接列表。
public void add(Dvd item) {
DvdNode addThis = new DvdNode(item);
if(head == null) {
head = addThis;
} else if(item.getTitle().compareToIgnoreCase(head.getItem().getTitle()) < 0) {
addThis.setNext(head);
head = addThis;
} else {
DvdNode temp;
DvdNode prev;
temp = head.getNext();
prev = head;
while(prev.getNext() != null && item.getTitle().compareToIgnoreCase
(prev.getNext().getItem().getTitle()) > 0) {
prev = temp;
temp = temp.getNext();
}
addThis.setNext(temp);
prev.setNext(addThis);
}
}