黑马程序员技术交流社区
标题:
小代码
[打印本页]
作者:
luck_start
时间:
2015-10-2 23:46
标题:
小代码
4、 有五个学生,每个学生有3门课(语文、数学、英语)的成绩,
* 写一个程序接收从键盘输入学生的信息, 输入格式为:name,30,30,30
* (姓名,三门课成绩), 然后把输入的学生信息按总分从高到低的顺序写入
* 到一个名称"stu.txt"文件中。要求:stu.txt文件的格式要比较直观,
* 打开这个文件,就可以很清楚的看到学生的信息。
*
* 思路:
* 1.学生的信息要从键盘接受,那么怎么样能把从键盘接受的数据变成
* 一个学生的属性信息呢?接受的是一个字符串,切割行不?
* 2.切割的字符串,变成字符串数组,由于输入的信息是有规律的,那么
* 就可以根据角标对应的学生信息进行传入.
* 3.学生信息传给了学生对象了,那么对象要怎么做呢?学生对象,需要
* 对这些信息进行整理.那么学生需要有对于这个信息有必要的判断方法.比如是不是同一个人呢?
* 4.一个一个的学生对象,我要怎么样整理呢?必须是集合了,集合就是来整理
* 对象的.学生对象都放集合了,还要对成绩有一个排序?那必须要集合自身的比较性才 可以完成.(学生只能自己和别人比一下,因为如果将学生作为一个对象参考的话,只知道自己和别人是不是一样的.而如果要站在学生整体上的排序,眼光就要站在一个可以统领和掌控学生的对象,也就是集合.)
* 5.集合,遍历,再打印学生对象信息,再输入到指定文件.
*
* 总结:
* 1.一个对象中可能存在很多属性,那么这些属性之间存在什么样的关系呢?有些属性是直接可以获取的,有些属性,是建立在其他属性的基础上才存在意义的.
* 2.学生如何比较,实现的是Comparable接口,重写了CompareTo方法.而集合比较是通过Comparator接口,实现compare方法.也可以一个自定义比较器.而这个比较器还是要通过comparator这张脸让集合自身具备了比较性.因此,comparator可以看作是集合比较方法一个中介.
* 3.集合自身比较性和元素自身比较性之间存在什么联系呢?好乱的感觉.我个人觉得,集合是一个更大的存在,但是这个集合要比较小小的元素,如何知道元素是排前还是排后呢?根据什么呢?就是根据元素给集合"提供的信息",元素本身做为一个对象,只知道自己和另一个元素谁大谁小,但是由于视角的局限性,让整体元素无法做出一个排序,只能把信息传递给集合,而集合可以站在一个更高的角度来说:你应该站在哪里.
* (好比a小朋友和b小朋友比较成绩,他们两个很清楚,但是他们无法做出整个班级小朋友的比较.这个时候小朋友需要把信息提供给老师,然后老师才能站在更高角度来进行审视,谁应该排在哪里....小朋友就相当于学生对象,老师就相当于集合)
*
* 思考:
* 1.对于编程而言,尤其是java的编程思想.对象和对象之间如何产生关系.既然万物都是对象,想必然对象和对象之间也会存在视角限制.这里面存在一个层次问题,我觉得,这个层次在心里一定要清晰可见.比如我站在一个教室的角度去看对象,那么就有了桌子,空调...等等.如果我站在一个桌子的角度,那么桌子上的水杯,书本...等等才会进入我的视角.不然的话,站在一个教室的角度,去审视一个水杯,这就属于跨级审视.结果就是混乱了.
* 2.对于每一个功能体,尽量做到独立封装.哪些是我需要控制的,就放外面,哪些是一个功能体,就封装起来.比如,我要控制存放的文件地址,那么,我就创建一个文件地址放在外面.我对排序要求控制,就需要在传入参数时候让其具备灵活性.假如这个功能是接受一个文件,返回一个字符串,那么就尽量封装起来..对于以后如果有相同需求,我们还可以调用以进行功能复用.
* 虽然只是一些小小的程序.但是,我们有必要从开始就拥有一个较完美的编程思想.等到程序变得越来越复杂的时候,我们也可以轻而易举的掌控.
* */
public class Demo04 {
public static void main(String[] args) throws IOException {
Comparator<Student> com = Collections.reverseOrder(); //自定义一个比较器
File fi = new File("c:\\stu.txt"); //指定文件目录.定义在外面更好一些,提高扩展.
Set<Student> se = StudnetIn(com,false); //将比较器传入方法以及排序方式..返回一个集合.
ToFile(se,fi); //将集合和file传入.
}
//对于集合进行遍历,获取对象元素.并输出到指定文件.
public static void ToFile(Set<Student> se,File fi) throws IOException {
Iterator<Student> it = se.iterator();
FileWriter fw = new FileWriter(fi);
while(it.hasNext())
{
Student s = it.next();
fw.write(s.toString() + s.getMax() + "\t"+"\r\n");
}
fw.close();
}
//传入比较器以及排序需求.如果是true,就是默认排序,否则就是自定义的排序.
public static Set<Student> StudnetIn(Comparator<Student> com,boolean bo) {
Scanner s = new Scanner(System.in);
Set<Student> se = null;
if(bo == true) //自然排序.
{
se = new TreeSet<Student>();
}
else //自定义排序(也就是定义的倒序)
{
se = new TreeSet<Student>(com);
}
while(true)
{
String ss = s.nextLine();
if(ss.equals("over")) //输入结束指令.
{
System.out.println("输入结束");
break;
}else
{
//切割,并将字符串和角标传递给student对象,并存入集合中.
String[] str = ss.split(",");
se.add(new Student(str[0],Double.parseDouble(str[1]),
Double.parseDouble(str[2]),Double.parseDouble(str[3])));
}
}
return se;
}
}
//定义一个实现Comparable的学生对象.
class Student implements Comparable<Student>
{
private String name;
private Double ch;
private Double ma;
private Double en;
private Double max;
Student(String name,Double ch,Double ma,Double en) //参数直接收语文,数学,英语,为什么?
{
this.name = name;
this.ch = ch;
this.ma = ma ;
this.en = en;
this.max = ch + ma + en; //总成绩是算出来的,不是传入的.
}
public int compareTo(Student stu) //重写compareTo方法.
{
//在这里要注意:谁是关键的?我们要比较什么?----成绩是关键的.
int i = new Double(this.max).compareTo(new Double(stu.max));
if(i == 0) //只有成绩相等,再去比较名字.
return this.name.compareTo(stu.name);
return i;
}
public int hashCode() //重写hashCode方法.
{
return (int) (this.name.hashCode() + this.max * 66);
}
public boolean equals(Student stu) //重写equals方法.
{
return this.name.equals(stu.name) && this.max == stu.max;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getCh() {
return ch;
}
public void setCh(Double ch) {
this.ch = ch;
}
public Double getMa() {
return ma;
}
public void setMa(Double ma) {
this.ma = ma;
}
public Double getEn() {
return en;
}
public void setEn(Double en) {
this.en = en;
}
public Double getMax() { //只想对外提供总成绩的get,而不提供set,为什么?
return max;
}
@Override
public String toString() {
return "Student [name=" + name + ", ch=" + ch + ", ma=" + ma + ", en="
+ en + "]";
}
}
作者:
luck_start
时间:
2015-10-2 23:47
努力,拼搏,分享,感恩
作者:
luck_start
时间:
2015-10-2 23:49
努力,拼搏,分享,感恩
作者:
heygirl
时间:
2015-10-3 12:02
组长棒棒哒!
作者:
luck_start
时间:
2015-10-4 20:03
heygirl 发表于 2015-10-3 12:02
组长棒棒哒!
文文棒棒哒
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2