2015-02-24 2 views
-2

Я пытаюсь сортировать значения в своей программе, используя метод сортировки Bubble. Я считаю, что мой код в методе organisedRoom верен. Однако, когда я запускаю код, добавляю некоторых клиентов, а затем пытаюсь их сортировать, программа вылетает из строя. Если кто-нибудь может направить меня в правильном направлении, я бы очень признателен.CompareTo bubble sort

package test; 

import java.io.IOException; 
import java.util.Scanner; 

public class Test { 

private class Customer implements Comparable<Customer>{ 
    private String name; 
    public Customer(String name) { 
     this.name = name; 
    } 

    //Override to stop the program returning memory address as string 
    @Override 

    public String toString() { 
     return name; 
    } 

    @Override 
    public int compareTo(Customer c) { 
     return name.compareTo(c.name); 
    } 
} 

//Array to store customers 
public Customer[] customers; 

public Scanner input = new Scanner(System.in); 

public Test(int nRooms) throws IOException { 
    customers = new Test.Customer[nRooms]; 
    System.out.println("Welcome to the Summer Tropic Hotel\n"); 
    chooseOption(); 

} 

final JFileChooser fc = new JFileChooser(); 

// Call new Hotel with int value to allocate array spaces 
public static void main(String[] args) throws IOException { 

    Test t = new Test(11); 

} 

// New procedure to return User input and point to next correct method 
private String chooseOption() throws IOException { 

    // Set to null, this will take user input 
    String choice; 

    //Menu options 
    System.out.println("This is the Hotel Menu. Please choose from the following options:\n"); 
    System.out.println("A: " + "This will add a new entry\n"); 
    System.out.println("O: " + "View booked rooms, in order of customers name.\n"); 
    System.out.println("X: " + "Exit the program\n"); 

    // Take user input and assign it to choice 
    choice = input.next(); 

    // Switch case used to return appropriate method 
    switch (choice.toUpperCase()) { 
     case "A" : 
      System.out.println(""); 
      addCustomer(); 
      return this.chooseOption(); 

     case "O" : 
      System.out.println(""); 
      organisedRoom(); 
      return this.chooseOption(); 

     case "X": 
      System.exit(0);    

    } 
    return choice; 
} 

// Add a new customer to the Array 
public void addCustomer() throws IOException { 

    // New variable roomNum 
    int roomNum = 1; 

    // Loop 
    do { 

     // Take user input as room number matching to array index - 1 
     System.out.println("Please choose a room from 1 to 10"); 
     roomNum = input.nextInt() - 1; 

     // If room is already booked print this 
     if (customers[roomNum] != null) { 
      System.out.println("Room " + roomNum + 1 + " is not free, choose a different one.\n"); 
      this.addCustomer(); 
     } 

    // Do until array index does not equal to null 
    } while (customers[roomNum]!= null); 

    System.out.println(""); 

    // User input added to array as name replacing null (non case-sensetive) 
    System.out.println("Now enter a name"); 
    customers[roomNum] = new Customer(input.next().toLowerCase()); 

    // Customer (name) added to room (number) 
    System.out.println(String.format("Customer %s added to room %d\n", customers[roomNum], roomNum + 1));   
} 

private void organisedRoom() { 

    boolean flag = true; 
    Customer temp; 
    int j; 

    while (flag) { 
     flag = false; 
     for (j = 0; j < customers.length - 1; j++) { 
      if (customers[j].compareTo(customers[j+1]) < 0) { 
       temp = customers[j]; 
       customers[j] = customers[j + 1]; 
       customers[j + 1] = temp; 
       flag = true; 
      } 
     } 
    } 
} 
} 

Я думаю, это связано с тем, что инициализация массива добавляет null ко всем местам индекса массива.

Трассировка стека выглядит следующим образом:

Exception in thread "main" java.lang.NullPointerException 
    at test.Test$Customer.compareTo(Test.java:34) 
    at test.Test.organisedRoom(Test.java:133) 
    at test.Test.chooseOption(Test.java:83) 
    at test.Test.chooseOption(Test.java:79) 
    at test.Test.chooseOption(Test.java:79) 
    at test.Test.<init>(Test.java:46) 
    at test.Test.main(Test.java:55) 
Java Result: 1 
+1

«Сбой программы» немного расплывчато. Что происходит? Есть ли трассировка стека? В какой строке возникает проблема? – khelwood

+1

Не пишите свой собственный алгоритм сортировки, используйте уже реализованные Java-приложения. – usr1234567

+0

Я не могу использовать реализованные алгоритмы сортировки Java, главным образом потому, что мой инструктор хочет, чтобы я использовал свой собственный алгоритм сортировки –

ответ

0

Это терпит неудачу, потому что вы создаете Customer[], который будет инициализирован with11 null ссылки. Если вы хотите заказать их все элементы в массиве будут сравниваться. Который ведет в java.lang.NullPointerException.

Храните Customer в ArrayList. Тогда вы должны быть в состоянии предотвратить эту ошибку.

редактировать
Если вам действительно нужно придерживаться как можно ближе к текущему коду. Ниже будет исправлена ​​ваша сортировка. (Не использовать это решение для реального проекта жизни)

private void organisedRoom() { 
    for (int i = customers.length - 1; i > 0; i--) { 
     for (int j = 0; j < i; j++) { 
      if (customers[j + 1] == null) { 
       continue; 
      } 
      if (customers[j] == null ||customers[j + 1].compareTo(customers[j]) < 0) { 
       Customer temp = customers[j + 1]; 
       customers[j + 1] = customers[j]; 
       customers[j] = temp; 
      } 
     } 
    } 
    System.out.println("show rooms: " + Arrays.toString(customers)); 
} 

редактировать 2
Чтобы сохранить большую часть своего текущего кода, вы можете сохранить номер в экземпляре Customer (который я лично не предпочел бы).

// change the constructor of Customer 
public Customer(String name, int room) { 
    this.name = name; 
    this.room = room; 
} 

// change the toString() of Customer 
public String toString() { 
    return String.format("customer: %s room: %d", name, room); 
} 

// store the Customer like 
customers[roomNum] = new Customer(input.next().toLowerCase(), roomNum); 
+0

Я не могу использовать ArrayList, это должен быть массив –

+0

. Я думаю, что это проблема с вашей проблемой, которая изложена по SubOptimal. нулевые ссылки. line 'if (customers [j] .compareTo (клиенты [j + 1]) <0) {' является источником – Prashant

+0

@ nmehta_001 Пожалуйста, взгляните на новое опубликованное решение. – SubOptimal

0

Ваша реализация Bubble Sort неверна. Он использует вложенные для циклов.

for(int i = 0; i < customers.length; i++) 
{ 
    for(int j = 1; j < (customers.length - i); j++) 
    { 
     if (customers[j-1] > customers[j]) 
     { 
      temp = customers[j-1]; 
      customers[j-1] = customers[j]; 
      customers[j] = temp; 
     } 
    } 
}