我正在尝试制作一个打印学生成绩列表的程序。当调用子类方法msort
时,我收到错误。程序根据标记进行排序,如果总标记相同,则调用另一个检查各个标记的函数。
import java.util.*;
class Student {
int[] ph, ch, ma;
int[] total;
int[] total_sort;
Student() {
}
// length of array and marks are received via constructor.
Student(int x, int[] p, int[] c, int[] m) {
// an array of p,c,m along with 2 arrays of total marks is made.
total = new int[x];
total_sort = new int[x];
ph = new int[x];
ch = new int[x];
ma = new int[x];
for (int i = 0; i < x; i++) {
ph[i] = p[i];
ch[i] = c[i];
ma[i] = m[i];
total[i] = (p[i] + c[i] + m[i]);
total_sort[i] = total[i];
}
}
// sorts the array accoring to the total marks
void Sort() {
// to use subclass method.
Stud_new t = new Stud_new();
for (int d = 0; d < total.length - 1; d++) {
for (int f = 0; f < total.length - d - 1; f++) {
if (total_sort[f] < total_sort[f + 1]) {
int temp = total_sort[f];
total_sort[f] = total_sort[f + 1];
total_sort[f + 1] = temp;
}
// checks for higher maths marks.
else if (total_sort[f] == total_sort[f + 1]) {
int m = t.mSort(f);
int temp1 = total_sort[f];
total_sort[f] = total_sort[m];
total_sort[f + 1] = temp1;
}
}
}
}
/* returns the index from original total array so as to identify the students' name.
* marks from sorted array are compared with original array to find the index of marks in originial array .
* this index is used to find the students' name.
*/
int GetList(int a) {
for (int j = 0; j < total.length; j++) {
if (total[j] == a) {
return j;
}
}
return -1;
}
}
class Stud_new extends Student {
int cSort(int ci) {
if (ch[ci] > ch[ci + 1]) {
return ci;
} else if (ch[ci] < ch[ci + 1]) {
return (ci + 1);
}
//else if(ph[pi] == ph[pi + 1])
//csort(pi);
return -1;
}
int pSort(int pi) {
if (ph[pi] > ph[pi + 1]) {
return pi;
} else if (ph[pi] < ph[pi + 1]) {
return (pi + 1);
} else if (ph[pi] == ph[pi + 1]) {
return (cSort(pi));
}
return -1;
}
int mSort(int mi) {
if (ma[mi] > ma[mi + 1]) {
return mi;
} else if (ma[mi] < ma[mi + 1]) {
return (mi + 1);
}
// checks higher phy marks
else if (ma[mi] == ma[mi + 1]) {
return (pSort(mi));
}
return -1;
}
}
class Mlist {
public static void main(String args[]) {
// initializes the names and marks.
String[] name = {"foo", "bar", "baz"};
int[] phy = {100, 112, 100};
int[] chem = {100, 120, 80};
int[] maths = {40, 68, 60};
Student stud = new Student(name.length, phy, chem, maths);
stud.Sort();
System.out.println("Name\tPhysics\tChemi\tMaths\tTotal");
// prints the merit list
for (int i = 0; i < name.length; i++) {
// index of name is received by a function call
/* STUD.TOTAL_SORT[i] IS STUDENTS' MARKS IN SORTED MANNER.
* THIS IS PASSED AS AN ARGUMENT TO GETLIST METHOD WHICH USES LINEAR SEARCH
* TO FIND THE INDEX IN THE ARRAY OF NAMES FOR THE STUDENT WHOSE MARKS IS PASSES
* THE FUNCTION RETURNS INT WHICH IS THE INDEX FOR NAME[] ARRAY. and others all well.
* HERE STUD.TOTAL_SORT[I] IS AN ARGUMENT TO THE FUNCTION STUD.GETLIST() WHICH RETURNS AN INT
*/
System.out.println(name[stud.GetList(stud.total_sort[i])] + "\t" + phy[stud.GetList(stud.total_sort[i])] + "\t" + chem[stud.GetList(stud.total_sort[i])] + "\t" + maths[stud.GetList(stud.total_sort[i])] + "\t" + stud.total_sort[i]);
}
}
}
答案 0 :(得分:0)
当您创建Student
的新实例时,您正在处理Stud_new
的新实例。您无法保留在一个实例中初始化的变量的状态。
要解决这个问题,一个反映super
的简单构造函数就足够了。
public Stud_new(final int x, final int[] p, final int[] c, final int[] m) {
super(x, p, c, m);
}
然后,您将在父Student
类中使用类似参数调用它。
Stud_new t = new Stud_new(total.length, ph, ch, ma);
请记住:继承保留了结构的完整性,而不是数据。如果你想要父母在孩子身上的数据,你必须提供它。
请注意,这不是对排序正确性的评论。这仅用于解决NPE问题。