Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对Java中的自定义泛型类型链表进行排序?_Java_Sorting_Linked List_Compare - Fatal编程技术网

如何对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

我正在用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 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);
      }
}