簡體   English   中英

具有通用arraylist的通用類

[英]Generic class with generic arraylist

希望我能對此有所幫助。 我試圖實例化具有通用arrayList作為成績列表的通用對象Student。 我無法使我的Add方法正常工作。 我一直收到一個空指針異常-這很明顯,因為它被初始化為null-只是不確定我的add方法出了什么問題。 任何幫助將不勝感激。 另外,此作業的要求非常嚴格-我必須這樣做。 謝謝。

我有兩節課:第一節,學生:

import java.util.ArrayList;

public class Student <S>{

    private String name;
    private ArrayList<S> grades;



    private double average;


    // the constructor
    public Student (String studentName, ArrayList<S> studentGrades){
        name = studentName;
        grades = studentGrades;
    }

    // get the name
    public String getName() {
        return name;
    }

    //set the name
    public void setName(String name) {
        this.name = name;
    }

    // add a grade to the array
    public void addGrade(S n){

        grades.add(n);

    }

    // return a grade from the array. This will be used for the calculation.
    public S getGrade(int n){

        return grades.get(n);


    }

    // compute the average grade for each student
    public double computeAverage(){

        Double sum = 0.00;
        for(S grade : grades){ 

            if (grade instanceof Double){
            sum += (Double)grade;
            }
            if (grade instanceof Integer){
                sum += (Integer)grade;
            }
        }
        average = sum.doubleValue()/ grades.size();
        return average;

    }

    public String toString()
    {
        return name + "'s average grade is " + average;
    }
}

第二,測試:

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        // create the studentList array
        ArrayList<Student> studentList = new ArrayList<Student>();
        HashMap<String, Student> studentMap = new HashMap<String, Student>();

        // the values for math.random to create the grades
        int min = 0;
        int max = 100;
        double dmin = 0.00;
        double dmax = 100.00;

        // initialize the variables

        ArrayList grades = null;

        //------------------------------------
        // Create the students (the method signature is wrong. It blows up regardless of what I try to add.)
        Student<Integer> Fred = new Student<Integer>("Fred", grades);   
        //null pointer exception. Also points to the add method in the student class.

        //-------------------------------------

        Student<Integer> Wilma = new Student<Integer>("Wilma", grades);
        Student<Double> Barney = new Student<Double>("Barney", grades);
        Student<Double> Betty = new Student<Double>("Betty", grades);   

        // add the random grades 
        for(int i = 0; i < 5; i++){
            Fred.addGrade((int) (Math.random() * (max - min) + min));
        }

        for(int i = 0; i < 5; i++){
            Wilma.addGrade((int) (Math.random() * (max - min) + min));
        }

        for(int i = 0; i < 5; i++){
            Barney.addGrade((double) (Math.random() * (dmax - dmin) + dmin));
        }

        for(int i = 0; i < 5; i++){
            Betty.addGrade((double) (Math.random() * (dmax - dmin) + dmin));
        }
        // add the students to the array list
        studentList.add(Fred);
        studentList.add(Wilma);
        studentList.add(Barney);
        studentList.add(Betty);

        studentMap.put(Fred.getName(), Fred);
        studentMap.put(Wilma.getName(), Wilma);
        studentMap.put(Barney.getName(), Barney);
        studentMap.put(Betty.getName(), Betty);


        //iterate through the list & print to the console
        Iterator<Student> itr = studentList.iterator();{
            while(itr.hasNext()){
                System.out.println(itr.next().<Student>toString());

                //Initialize the array to hold the key variables
                Set<String> mapKeys = studentMap.keySet();
                //mapKeys.add(something);

            }

        }

    }
}

您需要初始化ArrayList等級。 當前,您正在傳遞一個空值。 在該行中執行以下操作:

ArrayList grades = new ArrayList();

一個好的做法是在初始化ArrayList時使用泛型,但是由於您的成績似乎是不同的類型,因此我將其跳過。

在您的Test類中,您具有ArrayList grades = null; -您需要先創建成績ArrayList並使用數據填充它,然后再使用它。

您正在初始化測試成績為空

ArrayList grades = null;

當您嘗試添加成績時

Fred.addGrade(...);

學生的內部代碼

grades.add(n);

但是將等級初始化為null,從而創建Null Exception。

用適當的類型初始化成績。

例:

Student<Integer> Wilma = new Student<Integer>("Wilma", new ArrayList<Integer>());
Student<Double> Barney = new Student<Double>("Barney", new ArrayList<Double>());
Student<Double> Betty = new Student<Double>("Betty", new ArrayList<Double>());   

您可以執行以下操作:

public class Student<S>
{
    // declare array
    private final ArrayList<S> grades = new ArrayList<S>();
    private String name;

    // One arg constructor
    public Student(String name)
    {
        this.name = name;
    }

    // Two arg constructor
    public Student(String name, ArrayList<S> grades)
    {
        this(name);
        this.grades.addAll(grades);
    }

    // etc
}

在測試類中以以下方式編輯代碼:

 Student<Integer> Fred = new Student<Integer>("Fred", new ArrayList<Integer>());   
    //null pointer exception. Also points to the add method in the student class.

    //-------------------------------------

 Student<Integer> Wilma = new Student<Integer>("Wilma", new ArrayList<Integer>());
 Student<Double> Barney = new Student<Double>("Barney", new ArrayList<Double>());
 Student<Double> Betty = new Student<Double>("Betty", new ArrayList<Double>());   

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM