基于学生信息录入排序分割实验的总结

①实验要求:键盘录入学生的姓名和分数,并按照分数的升序输出学生信息。

        思路:1.创建Studen类,创建name,score,以及涉及到方法。

                    2.创建StudentTest类,对学生信息进行键入。

                    3.关于对象属性的比较。这里我用对象数组来实现升序输出。(具体请看代码)。

其实,对于比较对象属性的大小有个Comparator接口来实现。具体请看http://blog.csdn.net/x_zhaohu/article/details/51020262。

代码现实:

      1..创建Studen类,创建name,score,以及涉及到方法。

package com.xingzhaohu.test;

/**
 * @ClassName Student
 * @Description TODO
 * @author XingZhaohu  x_zhaohu@163.com
 * @date 2016-4-11  下午7:26:16
 */
public class Student {
		private String name;
		private double score; 
		
		public Student(){
			
		}
		public Student(String name,double score){
			this.name = name;
			this.score = score;
		}
		
		@Override
		public String toString(){
			return "name="+this.getName()+" score="+this.getScore();
		}
		/**
		 * @return the name
		 */
		public String getName() {
			return name;
		}
		/**
		 * @param name the name to set
		 */
		public void setName(String name) {
			this.name = name;
		}
		/**
		 * @return the score
		 */
		public double getScore() {
			return score;
		}
		/**
		 * @param score the score to set
		 */
		public void setScore(double score) {
			this.score = score;
		}
		
		
}

       2.创建StudentTest类,对学生信息进行键入。关于对象属性的比较。这里我用对象数组来实现升序输出。

package com.xingzhaohu.test;

import java.util.Scanner;

public class StudentTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner in = new Scanner(System.in);
	
		
		System.out.println("请输入学生的数量:");
		int count = in.nextInt();//学生数量
		Student[] students = new Student[count];
		
		int i = 0;
		while(i<count){
			System.out.println("请输入学生姓名和分数:");
			String name = in.next();//in.nextLine();
			double score = in.nextDouble();
			
			students[i++] = new Student(name,score);
		}
		
		for(i=0;i<students.length;i++){
			for(int j=i+1;j<students.length;j++){
				Student temp = new Student();
				if(students[i].getScore()>students[j].getScore()){
					System.out.println(students[i].getScore());
					temp = students[i];
					students[i] = students[j];
					students[j] = temp;
				}
			}
		}
		
		for(Student s : students)
			System.out.println(s.toString());
		
	}

}



②实现要求:

            1.按照如下格式,输入字符串:

                                                                  刘备,刘备,,20182203677,2016-04-12 13:41:58

                                                                  关羽,关羽,,20182203666,2016-04-12 13:42:58

                                                                  张飞,张飞,,20182203688,2016-04-12 13:43:58

           2.创建Student类,属性:name,number,date,。将字符串分割录入到Student中。

           3.并按照学号的升序输出。(这里用实现Comparator接口,重写compare方法实现升序输出)

思路:

         1.创建Student类,创建属性以及涉及到各种方法。(最重要的是构造方法)

         2.(为了更好的理解面向对象的思想)创建InputMessage类,来处理分割,创建Student的对象。

        3.创建实现Comparator接口的Compare类,重写compare()方法。

        4.创建StudentMessage类(含main()方法),在main()方法中调用Collection.sort();实现排序。

代码实现:

  1.创建Student类,创建属性以及涉及到各种方法。

class Student{
	private String name;
	private long number;//考虑到学号的长度
	private String date;
	public Student(){
		
	}
	public Student(String name,long number,String date){
		this.name = name;
		this.number = number;
		this.date = date;
		
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getNumber() {
		return number;
	}
	public void setNumber(long number) {
		this.number = number;
	}
	public String getDate() {
		return date;
	}
	public void setDate(String date) {
		this.date = date;
	}
	
	
	public String toString(){
		return "name = "+this.getName()+" number = "+this.getNumber()+" date = "+this.getDate();
	}
}

2.创建InputMessage类,来处理分割,创建Student的对象。在这里涉及String与long转换的问题。

class InputMessage{
	private String message;
	
	public InputMessage(String message){
		this.message = message;
		
	}
	
	public Student inputMessage(){
		
		String[] messages = this.message.split(",|,");//注意输入的字符的半全角问题
		
		/**
		 * 原先转为int msg = Integer.parseInt(messages[3]);范围溢出
		 * 又修改为 long msg = Integer.parseInt(messages[3]); 应然报错
		 * 查询 :long max value:9223372036854775807
		 * 修改为:如下
		 */
		long msg = Long.parseLong(messages[3]);
		
		Student student = new Student(messages[1],msg,messages[4]);
		 return student;
	}
}

3.实现Comparaotr接口的Compare类

class Compare implements Comparator<Student>{

	@Override
	public int compare(Student o1, Student o2) {
		// TODO 自动生成的方法存根
		if(o1.getNumber()>o2.getNumber())
			return 1;
		else if(o1.getNumber()>o2.getNumber())
			return -1;
		else
			return 0;
	}

4.测试类实现

测试时为了省劲,没有键入学生的数量直接赋值了。在直接复制的基础上修改,直接键入。会报错。

       

package com.xingzhaohu.ch05;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 * @ClassName StudentsMessage
 * @Description 输入学生信息,分割信息并实例化学生对象,并按学号排序输出
 * @author XingZhaohu  x_zhaohu@163.com
 * @date 2016-4-11  下午11:47:52
 */
public class StudentsMessage {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner  in = new Scanner(System.in);
		System.out.println("请输入学生的数量:");
		int stuCount = in.nextInt();
		
		Student[] students = new Student[100];//必须提前申请地址。
		
		int i=1;
		List<Student> list = new ArrayList();
		while(i<=stuCount){
			System.out.println("请输入字符串:");
			//in = new Scanner(System.in);
			String value = in.nextLine();
		
			InputMessage inputmessage = new InputMessage(value);
			students[i] = inputmessage.inputMessage();
		
			list.add(students[i++]);
		
		}
		
		Compare compare = new Compare();  
		Collections.sort(list,compare); 
		
		for(Student s : (List<Student>)list){
			System.out.println(s.toString());
		}
		
	}

}

真是得new者得天下啊。就是关键的一行代码,解决啦,在这还得感谢两位大哥的帮忙,正确的如下:

package com.xingzhaohu.ch05;


import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 * @ClassName StudentsMessage
 * @Description 输入学生信息,分割信息并实例化学生对象,并按学号排序输出
 * @author XingZhaohu  x_zhaohu@163.com
 * @date 2016-4-11  下午11:47:52
 */
public class StudentsMessage {

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner  in = new Scanner(System.in);
		System.out.println("请输入学生的数量:");
		int stuCount = in.nextInt();
		
		Student[] students = new Student[100];//必须提前申请地址。
		
		int i=1;
		List<Student> list = new ArrayList();
		while(i<=stuCount){
			System.out.println("请输入字符串:");
			in = new Scanner(System.in);//关键代码!
			String value = in.nextLine();
		
			InputMessage inputmessage = new InputMessage(value);
			students[i] = inputmessage.inputMessage();
		
			list.add(students[i++]);
		
		}
		
		Compare compare = new Compare();  
		Collections.sort(list,compare); 
		
		for(Student s : (List<Student>)list){
			System.out.println(s.toString());
		}
		
	}

}

出现的问题:

      1.student 空值作为显式参数传入,导致程序报错,解决方法, 用Student作为数据类型创建方法,返回实例化的对象。

      2.int与String  long与String   转换。         各自都有一定的方法。

      3. 键入学生数, 超过数组范围,     重新new   输入流;

      4.  声明对象数组时,尽管数组的大小可以用变量。但是还是要赋一定的值,这个地方我现在还没明白,猜测是如果数组的大小是变量,在类加载时不会给类对象数组分配空间,或者分配的少,。只能提前声明。(待解决)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值