У MyRoster Class возникли проблемы. в частности, мой метод сортировки и метод removeNull - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь создать класс с именем roster, который принимает объект Student и может добавлять, удалять, искать и т. Д. c. все мои методы работают, за исключением того, что я продолжаю получать исключение nullPointerException, когда вызываю свой класс сортировки. Кроме того, по какой-то причине, когда я загружаю список, он дважды печатает последний элемент в массиве. Я думаю, что эти две проблемы связаны.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedList;


public class Roster {
    
    private Object [] array = new Student [10];
    private LinkedList <Student> roster = new LinkedList<Student>();
    private int counter = 0;
    
    public Roster (Student student) {// O(1) this runs in constant time
        addStudent(student);
    }

    public Student[] getArray() {// O(1) this runs in constant time
        return (Student[]) array;
    }

    public void setArray(Student[] array) {// O(1) this runs in constant time
        this.array = array;
    }

    public LinkedList<Student> getRoster() { // O(1) this runs in constant time
        return roster;
    }

    public void setRoster(LinkedList<Student> roster) {// O(1) this runs in constant time
        this.roster = roster;
    }
    
    public Student[] sort() { //O(n^2) runs n^2 times for the nested for loop
        array = roster.toArray();
        
            for(int i =0; i < array.length; i++) { // O(n)
                
                for(int j =1; j < array.length - i; j++) // O(n)
                if((((Student) array[j - 1]).compareTo((Student) array[j])) >= 1) {
                    Student temp = (Student) array[j-1];
                    array[j-1] = array[j];
                    array[j] = temp;
            }
        }
        return (Student[]) array;
    } 

    public void loadRoster() { // O(n) executes the length of the array
        removeNull(array);
        for(int i =0; i< array.length -1; i++)
            System.out.println(array[i]);
    }
    
    public void addStudent(Student student) { // O(n) toArray()
        if(counter == 10)
            throw new IllegalArgumentException("Sorry the class is full");
        roster.add(student);
        array = roster.toArray();
        //sort((Student[]) array);
        counter++;
    }
    
    public void removeStudent(String ID) { // O(n) toArray()
        if(counter <= 0)
            throw new IllegalArgumentException("The class is empty");
        roster.remove(IDSearch(ID));
        array = roster.toArray();
        counter--;
    }
    public Object[] removeNull(Object[] tempArr) {
        
        int k = 0;
        for(int i =0; i < array.length; i++) {
                if (array[i] == null)
                    continue;
                tempArr[k] = (Student) array[i];
                k++;
        }
        return tempArr;         
    }

    public Student IDSearch( String IDNumber) {  // O(n) runs the for loop
        for(int i = 0; i < array.length;i++)
            if(((Student) array[i]).getIDNumber().equalsIgnoreCase(IDNumber)) {
                System.out.print(array[i]);
                return (Student) array[i];
            }
        System.out.print("Student not found");
        return null;
    }
    
    public Student nameSearch(String lastName , String firstName) { // O(n) for loop for array length
        for(int i = 0; i < array.length;i++)
            if((((Student) array[i]).getLastName().equalsIgnoreCase(lastName)) && (((Student) array[i]).getFirstName().equalsIgnoreCase(firstName))) {
                System.out.println(array[i]);
                return (Student) array[i];
            }
        System.out.print("Student not found");
        return null;    
    }
    
    public void save() { // constant time
        array = removeNull(array);
        sort();
    }

    public void saveChanges() throws FileNotFoundException{ // O(n) for loop to print to the new file
        save();
        File file = new File ("Roster.txt");
        
        if (file.exists())
            try {
                file.createNewFile();
            } catch (IOException e) {
                System.out.println("Error");
                e.printStackTrace();
            }
    
        PrintWriter out = new PrintWriter(file);
        for(int i =0; i <array.length; i++)
            out.println(array[i]);
        
        out.close();
    }
}

1 Ответ

0 голосов
/ 13 июля 2020

В вашей функции сортировки вы просматриваете весь массив учеников, который все еще может содержать нулевые значения. Обратите внимание, что array.length даст размер массива, а не количество установленных элементов. Я бы рекомендовал вам использовать метод removeNull (), чтобы избежать этой проблемы, или использовать значение счетчика вместо array.length в циклах for.

...