今天学习的过程中遇到了一道数组题,但由于这个数组的元素比较特别,是用户自定义的一个类,就形成了一个比较典型的“对象数组”问题。在这里记录一下!
题目大意:
- StudentMessage类包含3个属性:学号number、年级state、成绩score
- 创建20个学生对象,学号为1到20,年级和成绩都有随机数确定
- ①打印出3年级的学生信息
- ②使用冒泡排序按学生成绩排序,并遍历所有的学生信息
- 注意:
- 生成随机数:Math.rando(),返回类型为double
- 四舍五入取整:Math.round(double d),返回值类型为long
对象数组:对象 + 数组
- 数组是student数组---->每个元素都是student类型的
话不多说,具体的实现方法看代码(代码中有关于思路的注释):
<1>先放上第一个版本的代码(功能可以实现,只是还没有优化,结果看着会有些乱,如果不想看,可以直接看后边进行过结构优化的代码):
public class Student {
public static void main(String[] args) {
//声明一个StudentMessage类型的数组
/*
* 因为StudentMessage是一个类,
* 这是一个对象数组
*
* 其实,String[] 也是一个对象数组
* String也是一个类类型的,给它赋的值也是一个对象
*----> 也是对象数组
*
*数组的元素可以是任何类型,当然就也包括用户自定义的类类型
* */
StudentMessage[] stus = new StudentMessage[20];
/*
* 此时的情况:
* 栈中stus,堆中new了一个数组,长度为20,
* 此时每个位置的值为:null(因为没有赋过值)
* ------
* 接下来,给每个位置都new一个对象,再给对象中的属性赋值
* */
for(int i = 0;i < stus.length;i++) {
//给数组元素赋值
/*
* 此时,每个堆空间中的元素有值----是一个StudentMessage对象
* 但是,此时每个对象的属性值都是默认的0
* ----现在,给每个对象的属性赋值
* */
stus[i] = new StudentMessage();
stus[i].number = (i + 1);
//假设年级[1,6],这时候的强制类型转换是:截断(产生随机数)
stus[i].state = (int) (Math.random() * (6-1+1) + 1);
//成绩:[0,100]
stus[i].score = (int) (Math.random() * (100-0+1));
}
// //遍历学生数组----用于验证输出
// for(int i=0;i<stus.length;i++) {
System.out.println(stus[i]);//stus[]现在是对象,引用类型的变量里,不是null,就是存地址
System.out.println(stus[i].number+","+stus[i].state
+","+stus[i].score);
//
// System.out.println(stus[i].info());
// }
// System.out.println("****************");
//①打印出3年级的学生信息
for(int i=0;i<stus.length;i++) {
if(stus[i].state == 3) {
System.out.println(stus[i].info());
}
}
System.out.println("****************");
//②使用冒泡排序按学生成绩排序,并遍历所有的学生信息
for(int i=0;i<stus.length-1;i++) {
for(int j=0;j<stus.length-i-1;j++) {
if(stus[j].score > stus[j+1].score) {
/*
* 交换信息:笨一点的方法是一个个换
*/
// int number1 = stus[j].number;
// stus[j].number = stus[j+1].number;
// stus[j+1].number = number1;
// int state1 = stus[j].state;
// stus[j].state = stus[j+1].state;
// stus[j+1].state = state1;
// int score1 = stus[j].score;
// stus[j].score = stus[j+1].score;
// stus[j+1].score = score1;
/*
* 交换信息:灵活一点的方法是:直接交换stus[]中存储的地址即可
*因为如果需要换序,交换的是数的元素,StudentMessage对象
*/
StudentMessage temp = stus[j];
stus[j] = stus[j+1];
stus[j+1] = temp;
}
}
}
//
for(int i=0;i<stus.length;i++) {
System.out.println(stus[i].info());
}
}
}
//造student信息的类
class StudentMessage{
//属性
int number;
int state;
int score;
//显示学生信息的方法
public String info() {
return "学号:"+number+",年级:"+state+",成绩:"+score;
}
}
<2>进行过结构方面的优化,将一些功能写成了方法
/*
* 这是一个改进的代码
* 将操作数组的功能,封装到方法中
*/
public class Student1 {
public static void main(String[] args) {
StudentMessage1[] stus = new StudentMessage1[20];
// 赋值操作
for (int i = 0; i < stus.length; i++) {
stus[i] = new StudentMessage1();
stus[i].number = (i + 1);
// 假设年级[1,6],这时候的强制类型转换是:截断
stus[i].state = (int) (Math.random() * (6 - 1 + 1) + 1);
// 成绩:[0,100]
stus[i].score = (int) (Math.random() * (100 - 0 + 1));
}
// 造对象
Student1 test = new Student1();
// 遍历
test.print(stus);
System.out.println("****************");
// ①打印出3年级的学生信息
test.searchState(stus, 3);
System.out.println("****************");
// ②使用冒泡排序按学生成绩排序,并遍历所有的学生信息
test.sort(stus);
// 遍历
test.print(stus);
}
/**
*
* @Description 遍历StudentMessage1[]的操作
* @param stus
*/
public void print(StudentMessage1[] stus) {
for (int i = 0; i < stus.length; i++) {
System.out.println(stus[i].info());
}
}
/**
*
* @Description 查找StudentMessage数组中指定年级的学生信息
* @param stus 要查找的数组
* @param state 要找的年级
*/
public void searchState(StudentMessage1[] stus, int state) {
// ①打印出3年级的学生信息
for (int i = 0; i < stus.length; i++) {
if (stus[i].state == state) {
System.out.println(stus[i].info());
}
}
}
/**
*
* @Description 给StudentMessage1数组排序()冒泡排序
* @param stus
*/
public void sort(StudentMessage1[] stus) {
// ②使用冒泡排序按学生成绩排序,并遍历所有的学生信息
for (int i = 0; i < stus.length - 1; i++) {
for (int j = 0; j < stus.length - i - 1; j++) {
if (stus[j].score > stus[j + 1].score) {
/*
* 交换信息:灵活一点的方法是:直接交换stus[]中存储的地址即可 因为如果需要换序,交换的是数的元素,StudentMessage对象
*/
StudentMessage1 temp = stus[j];
stus[j] = stus[j + 1];
stus[j + 1] = temp;
}
}
}
}
}
//造student信息的类
class StudentMessage1 {
// 属性
int number;
int state;
int score;
// 显示学生信息的方法
public String info() {
return "学号:" + number + ",年级:" + state + ",成绩:" + score;
}
}
功能完成,继续学习!
路漫漫其修远兮,吾将上下而求索!!!