使用compareTo()方法按字母顺序对列表进行排序

我正在用java编写电话簿程序,我需要按字母顺序列出列表中的人员,为此我需要为java中的列表编写排序算法,它应该只使用compareTo()方法。 所以有人可以帮助我这样做吗?

public void listAlpha() { Node tempNode = head; for(int i = 0; i <= size; i++) { for(int j = 0; j <= i; j++) { int comparison = ((tempNode.getNext().getElement().getName()).compareTo(tempNode.getElement().getName())); if(comparison < 0) { Person tempPerson = tempNode.getElement(); tempNode.setElement(tempNode.getNext().getElement()); tempNode.getNext().setElement(tempPerson); tempNode = tempNode.getNext(); } } } 

(顺便说一下,这是一个家庭作业,我使用自己的数据结构。)

这是我上面写的方法所属的类:

 import java.util.*; /** Singly linked list implementation .*/ public class SLinkedList implements LinkedList, Iterable { protected Node head; // head node of the list protected Node tail; // tail node of the list protected int size; // number of nodes in the list public Iterator iterator() { return new LinkedListIterator(head); } /** Default constructor that creates an empty list */ public SLinkedList() { head = null; tail = null; size = 0; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public void addFirst(E newElement) { Node newNode = new Node(newElement,null); if(size == 0) //if list is empty tail = newNode; newNode.setNext(head); head = newNode; size++; } public void addLast(E newElement) { Node newNode = new Node(newElement,null); if(size == 0) //if list is empty head = newNode; if (size != 0) //if list is not empty tail.setNext(newNode); tail = newNode; size++; } public E removeFirst() { Node tempNode = null; if (size != 0) { if(size == 1) tail = null; tempNode = head; head = head.getNext(); tempNode.setNext(null); size--; } //if list is empty then return null return tempNode.getElement(); } public E removeLast() { Node tempNode = head; if(size == 0) return null; if(size == 1) { head = null; tail = null; size--; return tempNode.getElement(); } //size is greater than 1 for(int i=1; i<=size-2; i++) { tempNode = tempNode.getNext(); //go to element that before the tail } Node tempNode2 = tail; tail = tempNode; tail.setNext(null); size--; return tempNode2.getElement(); } public void remove(E element){ int index = 0; boolean found = false; Node temp = head; for(int i=1; i<=size; i++) {//find the node with element index++; if(temp.getElement().equals(element)){ found = true; break; } temp = temp.getNext(); } if(found){ if(index == 1) removeFirst(); else if(index == size) removeLast(); else{ //find the previous node Node prev = head; for(int i=1; i<index-1; i++) { prev = prev.getNext(); } prev.setNext(temp.getNext()); temp.setNext(null); size--; } } } public int searchList(E searchKey) { if(size == 0) return -1; Node tempNode = head; for(int i=1; i<=size; i++) { if(tempNode.getElement().equals(searchKey)) return i; //return index of the node tempNode = tempNode.getNext(); } return -1; //not found } public void printList() { Node tempNode = head; for(int i=1; i<=size; i++) { System.out.print(tempNode.getElement()); if(i!=size) //if it is not last element System.out.print(" - "); tempNode = tempNode.getNext(); } System.out.println(); } 

人员类:

 public class Person { private String name; private String surname; private String address; private PhoneNumber phone1; private PhoneNumber phone2; private PhoneNumber phone3; public Person() { name = null; surname = null; address = null; phone1.setPhone(0); phone1.setType(""); phone2.setPhone(0); phone2.setType(""); phone3.setPhone(0); phone3.setType(""); } public Person(String n, String s, String a,PhoneNumber p1, PhoneNumber p2, PhoneNumber p3) { name = n; surname = s; address = a; phone1 = p1; phone2 = p2; phone3 = p3; } public String getName() { return name; } public void setName(String n) { name = n; } public String getSur() { return surname; } public void setSur(String s) { surname = s; } public void insertPhone(PhoneNumber phone) { if(phone2 == null) phone2 = phone; else if(phone3 == null) phone3 = phone; } public PhoneNumber getPhone1() { return phone1; } public PhoneNumber getPhone2() { return phone2; } public PhoneNumber getPhone3() { return phone3; } public String getAdd() { return address; } public void setAdd(String a) { address = a; } 

正如其他人所提到的, compareToComparable接口的一部分。

如何实现它取决于您是否要首先按姓氏或名称排序,以及是否要按升序排序。

例如,如果您想先按姓氏排序,则按升序排序:

 public class Person implements Comparable { // the parts of Person you already have would go here public int compareTo(Person person) { if (person == null) { return -1; } if (surname != null && person.getSur() == null) { return -1; } else if (surname == null && person.getSur() != null) { return 1; } else if (surname != null && person.getSur() != null) { int compare = surname.compareToIgnoreCase(person.getSur()); if (compare != 0) { return compare; } } // Note that we did nothing if both surnames were null or equal if (name == null && person.getName() == null) { return 0; } else if (name != null && person.getName() == null) { return -1; } else if (name == null && person.getName() != null) { return 1; } else { return name.compareToIgnoreCase(person.getName()); } } } 

(我实际上没有测试这段代码)

这依赖于String的compareToIgnoreCase实现。

请注意,这也会将具有空名称和姓氏的所有空对象和对象移动到列表的末尾。

说了这么多,如果你实现Comparable,你可以让Collections API使用sort为你工作。

如果发现对象需要多种不同的排序方法,则可以创建一组Comparator对象来进行排序。

您可以使Person类实现Comparable ,并定义以下方法:

  public class Person implements Comparable { // Your previous code public int compareTo(Person other) { if (other == null) { // throw exception for example } return this.name.toLowerCase().compareTo(other.name.toLowerCase()); } } 

Person类的签名应该是这样的:

 public class Person implements Comparable 

将compareTo-method添加到Person类,并使用Collections.sort(personList)作为starf建议。

在Person类中实现Comparable

您的compareTo()方法将类似于:

 public int compareTo(Person other) { return name.compareTo(other.getName()) } 

然后使用Collections.sort();