①实验要求:键盘录入学生的姓名和分数,并按照分数的升序输出学生信息。
思路: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. 声明对象数组时,尽管数组的大小可以用变量。但是还是要赋一定的值,这个地方我现在还没明白,猜测是如果数组的大小是变量,在类加载时不会给类对象数组分配空间,或者分配的少,。只能提前声明。(待解决)