java对象数组实例:定义学生对象并给学生排序

java的学习笔记(资料来源自尚硅谷)

简介

本文主要目的是编写一个StudenTest对象,实现一下几个功能:
创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
一:打印出3年级(state值为3)的学生信息。
二:使用冒泡排序按学生成绩排序,并遍历所有学生信息

新建对象

package com.atguigu.cntact;


public class StudentTest {
    
    
	public static void main(String[] args) {
    
    

		//声明Student类型的数组,声明对象类型的数组时,后面要加上[],这儿是动态赋值方式
		Student[] stus = new Student[20];  //String[] arr = new String[10];
		
		for(int i = 0;i < stus.length;i++){
    
    
			//给数组元素赋值
			stus[i] = new Student();
			//给Student对象的属性赋值
			stus[i].number = (i + 1);
			//年级:[1,6]
			stus[i].state = (int)(Math.random() * (6 - 1 + 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].number + "," + stus[i].state 
//					+ "," + stus[i].score);
			
			System.out.println(stus[i].info());      用Alt+
		}
		
		System.out.println("********************");
		for(int i = 0;i <stus.length;i++){
    
    
			if(stus[i].state == 3){
    
    
				System.out.println(stus[i].info());  
//Eclipse环境中,输入syso按Alt+/,能够有提示,/必须是shift旁的那个,不能是小键盘那个,否则不起作用,注释按键ctrl+/也必须是该斜线
			}
		}
		
		System.out.println("********************");
	}
}

class Student{
    
    
	int number;//学号
	int state;//年级
	int score;//成绩
	
	//显示学生信息的方法
	public String info(){
    
    
		return "学号:" + number + ",年级:" + state + ",成绩:" + score;
	}
	
}

代码解释

代码的运行结果为

学号:1,年级:3,成绩:70
学号:2,年级:2,成绩:30
学号:3,年级:6,成绩:83
学号:4,年级:6,成绩:100
学号:5,年级:6,成绩:56
学号:6,年级:4,成绩:32
学号:7,年级:3,成绩:30
学号:8,年级:6,成绩:2
学号:9,年级:5,成绩:67
学号:10,年级:4,成绩:96
学号:11,年级:6,成绩:27
学号:12,年级:2,成绩:93
学号:13,年级:4,成绩:65
学号:14,年级:4,成绩:0
学号:15,年级:4,成绩:98
学号:16,年级:2,成绩:76
学号:17,年级:2,成绩:82
学号:18,年级:3,成绩:45
学号:19,年级:6,成绩:24
学号:20,年级:5,成绩:25


学号:1,年级:3,成绩:70
学号:7,年级:3,成绩:30
学号:18,年级:3,成绩:45


左边是栈,右边是堆
左边是栈,右边是堆,stus在栈内,堆new了一个数组,长度是20,每个位置的值是null,接下来才给每个位置的值赋值.
先建立一个student对象,分别建立int的学号年纪成绩,在new对象后,系统是默认给该对象属性赋值为0的。
然后在该对象内创建一个方法,方便在主函数中直接调用student对象方法。
ps:堆内数组赋值完后,存放的是对象的地址,指向堆空间该对象的属性和方法.

Math.random()
Math.random()默认产生大于等于0.0且小于1.0之间的随机double型随机数
即:0.0<=Math.random()<1.0
但是稍加处理就可以产生任意随机数
link

stus[i] = new Student();
			//给Student对象的属性赋值
			stus[i].number = (i + 1);

student[]数组本身就是一个引用数据类型,数组的元素是一个类,即自定义的引用数据类型.给stus[i]赋值肯定是stus类的对象,既然是对象,就必须new一个出来

public class MathRandom {
    
    
 
    public static int getRandomInt(int num1,int num2)
    {
    
    
        int n=num1+(int)(Math.random()*(num2-num1));
        return n;
    }
 
    public static char getRandomChar(char ch1,char ch2)
    {
    
    
        char ch=(char) (ch1+ Math.random()*(ch2-ch1+1));
        return ch;
    }
 
    public static void main(String args[])
    {
    
    
        System.out.println(MathRandom.getRandomInt(1,7)); //产生的随机数包括1,不包括7
        System.out.println(MathRandom.getRandomChar('a','b'));//a和b都包括
    }
}

加一个(int)是强制类型转换,截断。所以年级state要多加一个1,把六点几的年纪阶段成六年级.

冒泡排序

代码如下

//问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
		for(int i = 0;i < stus.length - 1;i++){
    
    
			for(int j = 0;j < stus.length - 1 - i;j++){
    
    
				if(stus[j].score > stus[j + 1].score){
    
    
					//如果需要换序,交换的是数组的元素:Student对象!!!
					Student temp = stus[j];
					stus[j] = stus[j + 1];
					stus[j + 1] = temp;
				}
			}
		}

外层的for循环指代的是冒泡排序的次数,n个数据会比较n-1次,第一次找出最大值,第二次找出次大值;内层的for循环指的是每一次排序要比较的次数,外层每找出一个最大值,内层都会少比较一次.

猜你喜欢

转载自blog.csdn.net/Meloneating/article/details/112954048