对象数组----面向对象编程

今天学习的过程中遇到了一道数组题,但由于这个数组的元素比较特别,是用户自定义的一个类,就形成了一个比较典型的“对象数组”问题。在这里记录一下!

题目大意:

  • 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;
	}
}

功能完成,继续学习!
路漫漫其修远兮,吾将上下而求索!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值