java - 为什么我的冒泡排序无法对对象数组进行排序?

标签 java bubble-sort

我创建了一个带有名为 CarlysCatering 的对象的程序。我正在尝试按客人数量对 CarlysCatering 对象进行排序。

我尝试使用冒泡排序,但收到错误消息。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        CarlysCatering[] event = new CarlysCatering[100];

        event[0] = new CarlysCatering(10, "A547", "6874714145", 0);
        event[1] = new CarlysCatering(100, "B527", "6874874945", 2);
        event[2] = new CarlysCatering(50, "C546", "6874785145", 3);
        event[3] = new CarlysCatering(40, "L577", "6874321485", 1);
        event[4] = new CarlysCatering(70, "A111", "6874714145", 4);
        event[5] = new CarlysCatering(90, "K222", "6874974855", 2);
        event[6] = new CarlysCatering(11, "F798", "6875555555", 3);
        event[7] = new CarlysCatering(17, "T696", "6474763898", 0);

        //SORT
        int selection = 0;
        do {
            System.out.println("1 - sort by eventID. 2 - sort by number of guests. 3 - sort by event type. 4 - quit");
            selection = input.nextInt();
            input.nextLine();

            if(selection == 1) {

            }

            if(selection == 2) {
                int n = event.length;
                for (int i = 0; i < n - 1; i++) {
                    for (int j = 0; j < n - i - 1; j++) {
                        if (event[j].getGuests() > event[j + 1].getGuests()) {
                            // swap arr[j+1] and arr[i]
                            CarlysCatering temp = event[j];
                            event[j] = event[j + 1];
                            event[j + 1] = temp;
                        }
                    }
                }
            }
        } while (selection != 4);

        //Print totals
        event[0].getTotals(); event[1].getTotals(); event[2].getTotals(); event[3].getTotals(); event[4].getTotals(); event[5].getTotals(); event[6].getTotals(); event[7].getTotals();
    }



////////////////////////////////////////////////////// STATIC METHODS //////////////////////////////////////////////////////////////////////

}

public class CarlysCatering {
    public static final int PRICE_PER_GUEST_HIGH = 35;
    public static final int PRICE_PER_GUEST_LOW = 32;
    public static final int CUTOFF_VALUE_LARGE = 49;
    private int guests;
    private int totalPrice;
    private String eventID;
    private String phoneNumber;
    private String eventType;
    private boolean largeEvent;

/////////////////////////////////////////////////////  CONSTRUCTORS  //////////////////////////////////////////////////////////////////
    CarlysCatering() {
        this.guests = 0;
        this.eventID = "A000";
        this.phoneNumber = "0000000000";
    }

    CarlysCatering(int guests, String eventID, String phoneNumber, int eventType) {
        this.guests = guests;
        this.eventID = eventID;
        //Phone Number formatting
        String phoneNumber2 = "";
        int count = 0;
        for(int i = 0; i < phoneNumber.length(); i++) {
            if (Character.isDigit(phoneNumber.charAt(i))) {
                phoneNumber2 += phoneNumber.charAt(i);
                count += 1;
            }
        }
        if (count != 10) {
            this.phoneNumber = "0000000000";
        } else {
            String phoneNumber3 = "(" + phoneNumber2.substring(0,3) + ") " + phoneNumber2.substring(3,6) + "-" + phoneNumber2.substring(6,10);
            this.phoneNumber = phoneNumber3;
        }
        //Event type formatting
        final String[] eventString = new String[5];
        eventString[0] = "wedding"; eventString[1] = "baptism"; eventString[2] = "birthday"; eventString[3] = "corporate"; eventString[4] = "other";

        if(eventType > -1 && eventType < 5) {
            this.eventType = eventString[eventType];
        } else {
            this.eventType = eventString[4];
        }
    }

/////////////////////////////////////////////////////////   SETTERS AND GETTERS   /////////////////////////////////////////////////

    //Setters
    public void setEventID(String eventID) {
        this.eventID = eventID;
    }
    public void setGuests(int guests) {
        this.guests = guests;
    }
    public void setPhoneNumber(String phoneNumber) {
        String phoneNumber2 = "";
        int count = 0;
        for (int i = 0; i < phoneNumber.length(); i++) {
            if (Character.isDigit(phoneNumber.charAt(i))) {
                phoneNumber2 += phoneNumber.charAt(i);
                count += 1;
            }
        }
        if (count != 10) {
            this.phoneNumber = "0000000000";
        } else {
            String phoneNumber3 = "(" + phoneNumber2.substring(0, 3) + ") " + phoneNumber2.substring(3, 6) + "-" + phoneNumber2.substring(6, 10);
            this.phoneNumber = phoneNumber3;
        }
    }
    public void setEventType(String eventType) {
        this.eventType = eventType;
    }
    //Getters
    public int getTotalPrice() {
        return totalPrice;
    }
    public int getGuests() {
        return guests;
    }
    public String getEventID() {
        return eventID;
    }
    public String getPhoneNumber() {
        return phoneNumber;
    }
    public String getEventType() {
        return eventType;
    }


    ///////////////////////////////////////////////////////  ADDITIONAL METHODS   ///////////////////////////////////////////////////////////////////
    public void isLargeEvent() {
        if (this.guests > CUTOFF_VALUE_LARGE) {
            largeEvent = true;
            System.out.println("Yes this is a large event.");
        } else {
            largeEvent = false;
            System.out.println("This is not a large event");
        }
    }

    public void getTotals() {
        boolean largeEvent = false;
        if(this.guests > CUTOFF_VALUE_LARGE) {
            largeEvent = true;
            this.totalPrice = this.guests * PRICE_PER_GUEST_HIGH;
        } else {
            largeEvent = false;
            this.totalPrice = this.guests * PRICE_PER_GUEST_LOW;
        }
        System.out.println("The number of guests attending event " + this.eventID + " " + this.eventType + " is: " + this.guests + ". The total price is $" + this.totalPrice);
        System.out.println("Large event: " + largeEvent);
        System.out.println("The phone number on file is " + this.phoneNumber);
    }
    // Static methods
    public static void showMotto() {
        System.out.println("*****Carly's makes the food that makes it a party.*****");
    }

}

当我尝试按客人排序时收到的错误消息是线程“main”java.lang.NullPointerException 中的异常,然后错误代码退出-1。导致错误的行是:

if (event[j].getGuests() > event[j + 1].getGuests()) {

最佳答案

您创建一个大小为 100 的数组。

之后,将其从索引 0 填充到 7

数组的所有其他位置仍为 null,但长度为 100

然后,您尝试对数组进行排序。

当您尝试取消引用(访问)8. 元素时,这会引发 NullPointerException:

event[j+1].getGuests()

我认为你应该使用较小的数组(大小为 8)或列表。

关于java - 为什么我的冒泡排序无法对对象数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57641206/

相关文章:

java - 如何从 adb 获取 GSF(谷歌服务框架)ID?

java - 无法调用我的 web 服务以解决 android 中的信任问题

java - ThreadPoolTask​​Executor 和 ThreadPoolExecutor 的区别和建议

c - 冒泡排序不适用于大文件,但适用于小文件

使用了 C++ 异常处理程序,但未启用展开语义 : What does it mean, 我该如何解决?

Java在ArrayList上实现比较器

java - 冒泡、选择、插入和快速排序中的交换和比较次数

c++ - 如何对指向另一个字符数组的指针数组进行冒泡排序

Python:如何使冒泡排序的实现更加省时?

java - 用图片替换了图片内容控件 - Word 在打开文件时报告灾难性故障