使用多个ArrayLists的基本Java编程

时间:2016-07-15 23:35:41

标签: java arrays

在下面的代码中,我列出了5个学生名,并将它们加载到String类型的ArrayList中。

import java.util.Scanner;
import java.util.ArrayList;
public class QuizAverage
{
    public static void main( String[] args ) {
        final int NAMELIMIT = 5 ;
        final int QUIZLIMIT = 5 ;
        ArrayList<String> sNames = new ArrayList<String>();
        ArrayList<String> sFamily = new ArrayList<String>();
        Scanner in = new Scanner(System.in);
        //Load the 5 names of the students in the arraylist
        for(int i = 1; i<=NAMELIMIT; i++)
        {
            String[] input = in.nextLine().split("\\s+");

            sNames.add(input[0]);
            sFamily.add(input[1]);
        }
        System.out.println("Name: ");
        System.out.println();
        for(int i=0; i<NAMELIMIT; i++)
        {
            System.out.println("Name: " +sNames.get(i) + " " +    sFamily.get(i));
        }
        System.out.println();
   }
}

但是,现在我尝试在代码中添加一个部分,为每个学生读取5个quizes的标记,并在Integer类型的ArrayList中加载测验标记

所以我知道我需要使用

ArrayList<Integer> quizMarks = readArrayList(readQuiz.nextLine());

然后将其传递给此代码,该代码采用测验标记并将其加权为15而不是100

public static ArrayList<Integer> readArrayList(String input)
{
    ArrayList<Integer> quiz = new ArrayList<Integer>();

    int i = 1;
    while (i <= QUIZLIMIT)
    {
       if (readQuiz.hasNextInt()) {
        quiz.add(readQuiz.nextInt());
        i++;
       } else {
           readQuiz.next(); // toss the next read token
       }
   }
   return quiz;
 }
 //Computer the average of quiz marks
 public static void computerAverage(ArrayList<Integer>quiz)
 {
    double total = 0 ;
    for(Integer value : quiz)
    {
        total = total + value;
    }
    total *= MAX_SCORE/100;
   System.out.println("Quiz Avg: "+ total / QUIZLIMIT ); 
  }
 }

所以我当前的代码带有输入:

Sally Mae 90 80 45 60 75
Charlotte Tea 60 75 80 90 70
Oliver Cats 55 65 76 90 80
Milo Peet 90 95 85 75 80
Gavin Brown 45 65 75 55 80

提供输出

Name: Sally Mae
Name: Charlotte Tea
Name: Oliver Cats
Name: Milo Peet
Name: Gavin Brown

当所需的输出为

Name: Sally Mae Quiz Avg: 10.5
Name: Charlotte Tea Quiz Avg: 11.25
Name: Oliver Cats Quiz Avg: 10.95
Name: Milo Peet Quiz Avg: 12.75
Name: Gavin Brown Quiz Avg: 9.6

3 个答案:

答案 0 :(得分:2)

正如吉姆所说,你应该把学生的标记和名字存放在同一个班级。这样做的原因是说你想要找到一个名叫Raj的特定学生的标记。

在您的实现中,您必须通过第一个数组来查找名为Raj的人的索引,然后转到marks数组中的相同索引。如果在初始化第一个数组时没有问题但是在创建标记数组时遇到了一些问题,那么最终可能会出现错误的标记。

此外,如果您必须向学生添加新属性,则必须创建新阵列,然后再添加一个逻辑来读取该数据。

通过课程,您可以轻松地对属于学生的所有数据进行分组。

对于你的平均问题,我有一个如下课程

class Student {
    private String name;
    private Double marks;

    public Student(String name, String marks) {
        this.name = name;
        this.marks = marks;
    }

    //getters setters
}

列出学生

List<Student> students = new ArrayList<Student>();

阅读后,您会将对象附加到此列表

students.add(new Student(name, marks));

计算平均值如下

Double average = 0;
for(Student student: students) {
    average += student.getMarks();
}
average = average / student.size();

结帐https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html了解其他获取平均值的方法。

答案 1 :(得分:1)

不要使用并行数组。改为使用Student类:

public class Student {
    private String name;
    private String family;
    private List<Integer> marks = new ArrayList<>();
    public Student(String name, String family)
    {
         this.name = name;
         this.family = family;
    }

    //  getters, setters
    ...

    public void addMark(int mark)
    {
        this.marks.add(mark);
    }
    public void getAverage()
    {
         ... // etc
    }
}

然后将此类的实例存储在主程序的单个列表中

List<Student> students = new ArrayList<>();

答案 2 :(得分:0)

你还没有从我看到的地方拨打computerAverage()

相关问题