2016-11-19 2 views
2

Я занимаюсь инвентаризационной системой библиотеки, поэтому я должен был сортировать имя внутри Узла в алфавитном порядке. У меня есть имя книги, автор, номер isbn, количество копий и жанр, вся эта информация, которую я храню внутри класса.Как отсортировать связанный список в алфавитном порядке с помощью Java?

Я написал код для его сортировки в алфавитном порядке, но это не сработало. Может ли кто-нибудь сказать мне, что случилось в моем коде?

Вот мой Linked класс Список содержит вставки и способ отображения:

public class LinkedList 
{ 
Node node = new Node(); 
static Node head; 

public LinkedList() 
{ 
    head=null; 
} 

public Node getHead() 
{ 
    return head; 
} 

public static void addNode(Data data) 
{ 
    Node newNode = new Node(data, head); 

    if (head == null) { 
     head = newNode; 
     newNode.setNext(null); 
    } else { 
     Node next = head; 
     Node prev = next; 
    do { 
     if (data.name.compareTo(next.data.name) < 0) { 
      break; 
     } 
     prev = next; 
     next = next.getNext(); 
    } while (next != null); 

    newNode.setNext(next); 
    if (data.name.compareTo(next.data.name) < 0) { 
     head = newNode; 
    } else prev.setNext(newNode); 
} 
} 

public static String displayNode() 
{ 
    Node current = head; 
    String output = ""; 
    while(current != null){  
     output+=current.data.toString(); 
     current = current.next; 
    } 
    return output; 
} 

Вот мой Узла класс:

public class Node 
{ 
Data data; 
Node next; 

public Node() 
{ 
    next = null; 
} 

Node(Data data, Node next) 
{ 
    this.data = data; 
    this.next = next; 
} 

public Object getData() 
{ 
    return data; 
} 

public Node getNext() 
{ 
    return next; 
} 

public void setNext(Node next) 
{ 
    this.next=next; 
} 
} 

Вот мой класс данных:

public class Data { 
LinkedList list; 
String name; 
String author; 
int isbn; 
int number; 
String genre; 

public Data(String name, String author, int isbn, int number, String genre) 
{ 
    this.name = name; 
    this.author = author; 
    this.isbn = isbn; 
    this.number = number; 
    this.genre = genre; 
} 

public String toString() 
{ 
    return("Book Name: "+name+"\nAuthor: "+author+"\nISBN Number: "+isbn+"\nNumber of Copies: "+number+"\nGenre: "+genre+"\n\n"); 
} 

public String getName() 
{ 
    return name; 
} 

Здесь мой класс Iterator, который я использовал для отображения списка:

public class DisplayIterator 
{ 
LinkedList list; 
static Node current; 
static Node newNode; 

DisplayIterator(Node newNode) 
{ 
    this.newNode = newNode; 
    current = list.head; 
} 

public static boolean hasNext() 
{ 
    if(current == null){ 
     return false; 
    } 
    else if (current.next == null){ 
     return false; 
    } 
    return true; 
} 

public static Node next() 
{ 
    if(hasNext()){ 
     current = current.next; 
    } 
    return current; 
} 

public static void remove(){ 
    throw new UnsupportedOperationException("It is read-only.");   
} 

} 

спасибо.

+0

вы добавляете не в верхней части списка без всякого порядка. Ваш цикл * while * выполняется только в связанном списке до его заказа. Если вы хотите отсортировать связанный список, вы должны добавить новый узел в нужное место, но не всегда вверху. Но, если я могу спросить, почему вы не используете * Collection *? –

+0

Любая причина, по которой вы изобретаете велосипед? Используйте интерфейс TreeSet и Comparable или Comparator. Они делают то же самое, но являются частью Java Lib. – brummfondel

+1

Конечно, он должен использовать 'Collection', но я предполагаю, что для назначения требуется написать реализацию связанного списка. –

ответ

1

В следующем коде реализована вставка, основанная на заказе, в связанном списке. Это, конечно, предполагает, что список уже отсортирован. Это безопасно, потому что единственный способ в вашем интерфейсе добавить узлы в связанный список - через этот метод.

public static void addNode(Data data) { 
    Node newNode = new Node(data, head); 
    if (head == null) { 
     head = newNode; 
     return; 
    } 
    Node current = head; 
    while (current.next != null && data.name.compareTo(current.data.name) >= 0) { 
     current = current.next; 
    } 
    if (current == head && data.name.compareTo(current.data.name) < 0) { 
     newNode.next = head; 
     head = newNode; 
    } 
    else { 
     newNode.next = current.next; 
     current.next = newNode; 
    } 
    JOptionPane.showMessageDialog(null,"Book Information has been added to the inventory."); 
} 
+0

Когда я вошел во второй данные, он показывает ошибку: «Исключение в потоке» AWT-EventQueue-0 »java.lang.NullPointerException' – Acetamide

+0

@TimBiegeleisen Я не думаю, что это обрабатывает случай, когда есть только один элемент, и второй элемент, который нужно вставить, вставлен в голову. – rafid059

+0

Не все еще не сортирует ... Я вхожу в d, a, c, b, чтобы он отображал мне d, a, c, b. Также я использую реализацию итератора, чтобы отобразить его тоже. – Acetamide

0

Я полагаю, ваш Node не один из Java Util LinkedList, верно? Можете ли вы обеспечить его реализацию? Почему его конструктор head?

Вставить новый элемент в начале и попытаться пройти вперед. И в конце вашей петли в вашем current находится первый больше и previous последний меньше. До сих пор правильно.

Но после этого вы никогда не используете Previous и задаете для него новый элемент. Вы не вставляете его между previous и current. Нечто подобное:

if (previous == null) 
     head = newData; 
    else 
     previous.next = newData; 

    newData.next = current; 
+0

Я вижу, понял. Благодаря! – Acetamide

+0

Добро пожаловать. Но в качестве структуры для сортировки элементов, это более подходящая куча. В java я буду использовать PriorityQueue и просто реализовать Компаратор для ваших данных. Это намного эффективнее. – fairtrax

0

Java имеет богатую библиотеку для сортировки для любого набора данных

java.util.Collections.sort(YOURLIST_valiable) 
Смежные вопросы