您的位置:首页 > 编程语言 > Java开发

Java中对象数组初始化和排序

2017-09-26 21:32 429 查看

java中对象数组初始化和排序

由于今天上机的一道题感觉比较坑,所以总结一下。

题目:

(Y. Daniel Liang英文版八版 P232:6.19)( Y. Daniel Liang英文版第10版P279:7.17)(Sorting students) Write a program that prompts the user to enter the number of students, the students’ names, and their scores, and prints student names in decreasing order of their scores.

译:编写一个程序,提示用户输入学生的个数、学生的姓名和他们的成绩,然后按照学生成绩的降序打印学生的姓名。

分析:这题很简单,核心就是排序。首先要把各个人的数组存下来,然后进行排序,当然可以写一个冒泡排序来实现。但是,既然Arrays类里面有排序的方法,为什么不尝试使用一下呢?然后照着这个思路,遇到了不少bug。。。

对象数组的初始化

初始化的必要性

//部分代码
int n = input.nextInt();
Student[] array = new Student
;
for(int i = 0;i < n;i++){
System.out.print("Name:");
array[i].setName(input.next());
System.out.print("Score:");
array[i].setAge(input.nextInt());
}


上面的代码建立了一个对象数组,并且对这个数组进行相应的操作。

运行时会抛出异常:Exception in thread “main” java.lang.NullPointerException

错误原因:

在Java中对非基本数据初始化时,必须使用new。在使用new创建数组后,此时数组还是一个引用数组。只有再创建新的对象,并把对象赋值给数组引用,初始化才结束。

如何初始化对象数组

int n = input.nextInt();
Student[] array = new Student
;
//对象数组初始化
for(int i = 0;i < n;i++){
array[i] = new Student();
}


数组array[i]未初始化之前所存储的是一个引用。只有创建对象并把其赋值给引用都完成后初始化才结束。

对象数组的排序

起初我直接调用Arrays.sort();结果可想而知,满屏的错误信息,因为计算机并不知道要以什么规则来比较两个对象。

After searching information:

我在这里调用用Arrays.sort(),并用java.lang.Comparable中的compareTo来规定排序的规则来实现对对象数组的排序。

public int compareTo( NumberSubClass referenceName )


如果指定的数与参数相等返回0。

如果指定的数小于参数返回 -1。

如果指定的数大于参数返回 1。

public int compareTo(Object o)
{
Student s=(Student)o;
//如果成绩相同就按名字来排序
if (this.score == s.score)
return this.name.compareTo(s.name);
//升序
/*if (this.score < s.score)
return -1;
else if (this.score == s.score)
return 0;
else
return 1;
*/
//降序
if (this.score < s.score)
return 1;
else if (this.score == s.score)
return 0;
else
return -1;
}


这里compareTo定义在类的里面,相当于内部比较器,来规定排序的规则;

这里按照成绩来排序,并且在成绩相同时,按照名字字母序来排序。

其它比较方法

Comparator比较器

它是在一个独立的类中实现比较,是外部实现的排序。 如果一个类没有实现Comparable接口,或是这个对象不支持自比较或者自比较函数不能满足你的要求时,可以通过Comparator来实现比较算法进行排序,并且为了使用不同的排序标准做准备,比如:升序、降序。

所以,如想实现排序,就需要让类对象自身实现Comparable接口,重写其中的compareTo(T o)方法;或在外部定义比较器实现Comparator接口,重写其compare(T o1,T o2)方法。前者只有一个参数,后者有两个参数。

附录:

完整代码

import java.util.Scanner;
import java.util.Arrays;
import java.lang.Comparable;

public class Main {

public static void main(String[] args) {
Scanner input = new Scanner(System.in);

System.out.println("input the num of students:");
int n = input.nextInt();
Student[] array = new Student
;
int i;
for(i = 0;i < n;i++){
array[i] = new Student();
}
for(i = 0;i < n;i++){
System.out.print("Name:");
array[i].setName(input.next());
System.out.print("Score:");
array[i].setAge(input.nextInt());
}
Arrays.sort(array);
for(i = 0;i < n;i++){
System.out.println(array[i].getName()+"--"+array[i].getAge());
}
}
}

class Student implements Comparable
{
private int score;
private String name;

public Student(){
this.score = 0;
this.name = null;
}

public void setName(String name){
this.name = name;
}

public void setAge(int age) {
this.score = age;
}

public String getName(){
return name;
}

public int getAge(){
return score;
}

public int compareTo(Object o)
{
Student s=(Student)o;
//在成绩相同时,按照名字字母序来排序
if (this.score == s.score)
return this.name.compareTo(s.name);
if (this.score < s.score)
return 1;
else if (this.score == s.score)
return 0;
else
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java