1、因为人数不定,所以需要用到线性表或者链表,粗看之下,链表似乎效率高(事实貌似未必。。。)
2、用一个package存放链表的定义,其中MyList为接口,MyAbstractList 实现接口,MyLinedList 继承MyAbstraList
3、刚百度了下接口和继承的区别,原来java不能多重继承,【多重继承就一个子类继承多个父类】,但是允许实现多个接口
4、另外,如果一个有一个父类,那么他应该被定义成Abstract
5、每个人都有很多信息,比如学号,起点、终点、用时,总距离,平均速度,在C语言中,这些信息应该存放在结构体,但是在java中我们用一个自定义类:datasheet来存放
6、在main函数里,首先要读取一行,然后split成多段,用字符串数组保存,然后 new 一个新的datasheet对象stu,先初始化他的编号,接着遍历已有的list,看看有无同名,有,则用update函数,无则把这个stu 添加到list里面,循环,直到结束,然后遍历所有list,把距离、速度、学号输出
7、思路很简单,一开始就想到了,只是以前没有干过这种事情,所以在具体实现上有困难,所以现在要趁热回顾一下
8、新建datasheet对象student并且初始化它的编号
DataSheet student = new DataSheet(); //放入DataSheet里
student.setNumber(subline[0]);
9、遍历已有的list,看看有无同名的记录
int temp = list.indexOfNumber(student);
10、此处的遍历是具体的遍历,仅仅查找有无 number一样的记录,所以要具体写indexOfNumber
首先,此方法对象是list,所以应该写在MyLinkedList里
但是,蛋疼的是,对比的东西是 number,而number又是datasheet里的变量,所以要把进行比较的两个变量转化成datasheet类型(关键)
public intindexOfNumber(Object o){if(first == null)return -1;
Node current=first;for(int i=0; i
DataSheet student=(DataSheet)current.element;if(student.equals(o))returni;else current =current.next;
}return -1;
}
11、上一步还要重写 equals 方法
因为 equals 的对象是 student 这是datasheet里的变量,所以根据对象是谁,就把方法重写在哪的原则
equals 应该重写在 datasheet 里(关键)
具体重写很简单,只用 eclipse 自带的重写equals 功能根据变量 number 重写就OK了
12、写完 indexOfNumber方法后,就简单了
if(temp == -1){
student.initial(subline[0], subline[1].charAt(0), Long.parseLong(subline[2]));
list.addLast(student);//列表末未添加一个记录
}else{
student=(DataSheet)list.get(temp);
student.update(subline[0], subline[1].charAt(0), Long.parseLong(subline[2]));
list.set(temp, student);//更新此人的数据
}
13、但是最后还有一个关卡,要遍历所有的记录,把 number、speed、distance 输出来
只要在datasheet里重写 toString 方法就OK了
publicString toString() {//TODO Auto-generated method stub
return String.format("Number:%s , Distance:%d , Speed:%f",
number, distance, speed) ;
}