Java中对象数组初始化和排序
来源:互联网 发布:软件性能指标展示 ppt 编辑:程序博客网 时间:2024/05/22 05:27
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[n]; 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[n]; //对象数组初始化 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[n]; 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中对象数组初始化和排序
- JAVA中初始化对象数组
- java中数组的初始化和基本排序算法
- Java中对象数组初始化与NullPointerException
- java中对象数组初始化后使用
- java中 对象数组的初始化
- Java类对象数组声明和初始化
- java对象数组的声明和初始化
- java数组的初始化;数组对象和数组变量
- java初始化对象数组?
- java对象数组初始化
- Java中数组声明和初始化
- JAVA中对象创建和初始化过程
- JAVA中对象创建和初始化过程
- JAVA中对象创建和初始化过程
- JAVA中对象创建和初始化过程
- Java中对象的初始化和回收
- Java中对象数组的排序
- ios稳定性测试工具-swiftMonkey
- Java中Unsafe类详解
- 正则表达式验证密码(大小写字母、数字、特殊符号 四选三)
- Ubuntu 16.04下安装OpenStack(juno) 之add the image service报错分析
- JavaWeb学习总结(一)——JavaWeb开发入门
- Java中对象数组初始化和排序
- 开源一个用于查看搬瓦工 VPS 流量使用情况的小网页(PHP)
- Java 8 stream 分组 合并
- java.util.Date和java.sql.Date的区别及应用
- 安卓学习笔记(6)-控制ListView显示列表的数量
- 【洛谷】P1965 转圈游戏
- C程序内存布局
- JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)
- LambdaHelper 通过反射调用Dal中方法是设置Lambda参数