one-05 while 、do-while循环 数组

1.while do-while循环

  1. whie循环: 先判断,后执行

while(条件){满足条件执行的循环体 }

public static void main(String[] args) {
		/**参数100是自定义的,此时生成的随机数的范围是[0,100)以内的整数*/
		int r = new Random().nextInt(100);
		System.out.println(r);
		
		guessNum(r);
	}
	//本方法用来完成猜数字的功能
	private static void guessNum(int r) {
		/**while(判断是否能继续循环的条件){如果条件的结果为true,执行此处的代码}
		 * 所以,while经常被用于写死循环: 格式: while(true)
		 * 但是一定注意,死循环一定要设置程序的出口[循环什么时候结束]
		 * */
		System.out.println("猜猜看^_^");
		while(true) {
			int input = new Scanner(System.in).nextInt();
			if(input > r) {
				System.out.println("猜大了");
			}else if(input < r) {
				System.out.println("猜小了");
			}else if(input == r) {
				System.out.println("恭喜你猜对了!");
				break;//当用户猜对了,就结束循环,本处为死循环的出口
			}
		}
	}
  1. do-while循环 : 先执行一次,再判断,如果符合条件,开始第二轮循环,不符合,结束

do{ 循环体 }while(条件);

可以设置死循环,一定注意:死循环一定要设置出口

public static void main(String[] args) {
		int n;
		do{
			System.out.println("我是do");
			n = new Random().nextInt(100);
			System.out.println(n);
		} while(n>50);{
			System.out.println("我是..while");
		}
	}

2.数组

1. 数组的创建方式

//1.1静态创建 -- 创建的时候已经知道了每一个元素的值
	char[] c1 = {'h','e','l','l','o'};
	char[] c2 = new char[] {'h','e','l','l','o'};
	//1.2动态创建 -- 知道了数组的长度,后面再具体赋值
	char[] c3 = new char[5];//在内存中开辟一块连续的内存空间,用来存放5个字符
	//1.2.2给c3数组动态赋值
	/**通过数组的下标来操作数组中的每一个元素,注意数组下标从0开始*/
	c3[0] = 'h';
	c3[1] = 'e';
	c3[2] = 'l';
	c3[3] = 'l';
	c3[4] = 'o';
	System.out.println(c1);
	System.out.println(c2);
	System.out.println(c3);
	
		

1.2 数组创建的过程

  1. 开辟内存一块连续的内存空间 ,用来存放多个相同类型的数据
  2. 数组完成初始化的过程,给数组内每个元素赋予数组对应的默认值 , 如int的默认值是0
  3. 数组完成初始化后 , 分配一个唯一的地址值
  4. 把唯一的地址值交给数组的引用类型变量 [数组名] 来保存
  5. 先要操作数组中的元素 , 可以根据变量保存的地址找到数组 , 然后根据数组的下标来操作数组的具体元素
    注意 : 数组名保存的是数组的地址值,不是数组中的具体元素,数组名是一个引用类型变量

1.3 数组的特性

  1. 通过数组的下标来操作数组中的元素, 数组下标从0开始,最大下标是数组的长度减1
  2. 数组的长度可以通过"数组名.length"来获取
    数组长度不可改变
    想要增加或者是删除数组中的元素,需要创建新长度的数组,原数组的长度无法改变

2.数组的工具类Arrays

  1. toString(数组名) : 查看当前数组内的所有元素
    除了char类型的数组,其他类型的数组想查看数组内的具体元素都得用toString().
		String[] s1 = {"a","b","c"};
		String[] s2 = new String[] {"a","b","c"};
		String[] s3 = new String[3];
		s3[0] = "a";
		s3[1] = "b";
		s3[2] = "c";
/**char类型的数组底层中做了处理,可以直接打印数组中的具体元素,
* 除了char类型以外的数组想要查看数组中的具体元素,需要使用数组的工具类Arrays
* 具体方式: Arrays.toString(数组名);
* 注意Arrays使用时需要导包*/
		System.out.println(Arrays.toString(s1));
		System.out.println(s2);//直接打印只会输出s2数组的地址值
		System.out.println(s3);

  1. copyOf(要复制的数组名,新数组的长度) : 用来进行数组的复制/缩容/扩容
  2. sort(数组名) : 对数组内的元素快速排序
//查看数组的长度 -- 数组中存放的元素的个数
		/**数组一旦创建,长度不可改变,如果想要增加或者删除数组中的元素,
		 * 只能先创建一个新长度的数组,再将原来的数据复制过去*/
		//System.err.println(c1.length);
		//System.err.println(s1.length);

public static void main(String[] args) {
	int[] from = {1,2,3,4,5};
	//sort()用于数组的排序
	System.out.println(Arrays.toString(sort(from)); 
	/**copyOf()用于完成数组的复制,两个参数:
	 * 参数1: 要复制的数组
	 * 参数2: 新数组的长度
	 * */
	//数组的复制
	int[] to = Arrays.copyOf(from, 5);
	System.out.println(Arrays.toString(to));
	//数组的扩容
	/**扩容: 给数组扩充容量, 新数组的长度 > 原数组的长度*/
	/**扩容思路: 先创建对应长度的新数组,每个位置上都是默认值0
	 * 然后从原数组中将元素复制到新数组,没有被覆盖的元素还是默认值0*/
	int[] to2 = Arrays.copyOf(from, 10);
	System.out.println(Arrays.toString(to2));
	
	/**缩容: 缩小数组的容量, 新数组的长度 <  原数组的长度*/
	/**缩容思路: 先创建对应长度的新数组,每个位置上都是默认值0
	 * 然后从原数组中复制指定个数的元素到新数组中,类似于截取*/
	int[] to3 = Arrays.copyOf(from, 3);
	System.out.println(Arrays.toString(to3));
	
	//指定首位截取原数组中的元素
	/**copyOfRange()用于完成数组的截取,3个参数:
	 * 参数1: 要截取哪个数组 [原数组] 
	 * 参数2:从原数组的哪个下标开始
	 * 参数3:到原数组的那个下标结束*/
	/**注意: 截取的元素包含开始下标处的元素,不包含结束下标处的元素*/
	int[] to4 = Arrays.copyOfRange(from, 2,4);
	System.out.println(Arrays.toString(to4)); //打印结果为[3,4],含头不含尾,左闭右合;
}

3. 遍历动态数组,取数据与存数据

public static void main(String[] args) {
	//m1();//遍历数组取数据
	m2();//遍历数组存数据
}

private static void m2() {
	//1.创建一个长度为10的动态数组
	int[] a = new int[10];
	//2.遍历数组,依次给数组的每个位置上的元素赋值
	for(int i=0 ; i <= a.length-1 ; i++) {
		//a[i] 根据每轮循环得到的i,作为数组下标,操作数组对应位置上的元素
		a[i] = i+100;
	}
	//3.循环结束以后,说明数组的每个位置都经历了赋值 [存数据] 
	System.out.println(Arrays.toString(a));
}

private static void m1() {
	//1.创建一个数组,用来存放12个月每个月的天数
	int[] month = {31,28,31,30,31,30,31,31,30,31,30,31};
	/**数组的遍历: 从头到尾把数组每个位置轮一遍*/
	//通过for循环遍历数组,通过数组下标来操作数组中的元素
	for(int i=0; i<=month.length-1; i++) {
		System.out.println((i+1)+"月有"+month[i]+"天");
	}
}

4.冒泡排序实现代码

具体实现参考: 程序媛 泡泡老师

排序思路参考: 程序媛 泡泡老师

排序思路:
1)需要比较多轮,如果有n个数,最多比较n-1轮
2)在每一轮中,需要进行多次的相邻比较,如果相邻元素前一个大于后一个,就互换
注意:前面轮中确定的最大值,不需要参与本轮的比较
3)我们使用的是嵌套for循环来完成的:
外层循环循环变量代表的是轮数【数组的长度-1】
内层循环循环变量代表的是数组的下标【轮数越后,次数越少,所以j 随着i 的增大而减小】
4)优化思路:
之前轮中的最大值,不需要参与本轮的比较
如果顺序没有那么乱,我们有可能不需要比较n-1轮,这个时候就需要确定什么时候提前结束剩下的轮数
所以,我们可以设置一个信号量flag,初始值为false,如果一但发生数据的交换,说明顺序还为排好,我们就把flag改为相反的值true,在本轮所有相邻比较结束以后,判断flag是初始值还是中途被修改成了true,如果所有相邻比较都完成,flag没有中途被修改,说明所有数据没有发生交换位置,也就是说,数据已经提前排好序了,那么我们就直接结束剩下几轮的循环,提高效率。

public static void main(String[] args) {
	int [] a = {17,96,73,25,21};
	//3.实际开发中使用Arrays数组工具类的排序方法sort(数组名);
	Arrays.sort(a);
	System.out.println(Arrays.toString(a));
	//method(a);
}

private static void method(int[] a) {
	//1.外层循环 从哪开始1  到哪结束a.length-1  怎么变化++
	/**控制的是轮数,假如有n个数,最多比较n-1轮
	 * 从第一轮开始,最大轮数就是 n [数组元素个数] -1
	 * */
	// i代表的是轮数
	for(int i=1; i <= a.length-1; i++) {
		boolean flag = false; //冒泡排序优化
		System.out.println("第"+i+"轮");
		//内层循环 从哪开始0   到哪结束a.length-i   怎么变化
		/**控制的是在这一轮中比较的次数
		 * 注意j代表的是数组的下标,因为要通过下标操作数组中的元素, 相邻比较
		 * 从数组的0号下标开始,最大下标不是固定的,随着i的变化而变化
		 * 注意: 上一轮确定的最大值,不需要参与本轮的比较,所以i确定i个,要-i
		 * */
		for(int j=0; j<a.length-i;j++) {
			//3.相邻比较,位置不对就,互换位置
			if(a[j] > a[j+1]) { //如果前面的数大于后面的数
				//交换两个位置上的元素
				int t;
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
				flag = true;
			}
		}
		if(flag == false) { //如果经历了内层循环的所有比较,flag还是初始值
			//说明,所有数据已经排序成功,无需进行下一轮排序
			break;
		}
		System.out.println("第"+i+"轮排序后的效果"+Arrays.toString(a));
	}
	System.out.println("排序完成后的数组"+Arrays.toString(a));
}

5.混合案例

    /**本方法用来实现创建随机数组,并通过冒泡排序实现随机生成的数组的排序*/
    public static void main(String[] args) {
        //1.将一个随机数赋值给变量length
        int length = new Random().nextInt(10)+5;
        //2.将变量length存入动态数组a中
        int[] a = new int[length];
        //System.out.println(Arrays.toString(a));
        //3.遍历a数组,并在a数组中存入随机数
        for(int i=0; i<=a.length-1; i++){
            a[i] = new Random().nextInt(100);
        }
        System.out.println(Arrays.toString(a));
        //4.利用冒泡排序实现随机数组a的排序
        //4.1外层循环控制所有数组要比较的轮数
        //从 1 开始  到a.length-1结束  i++
        for(int i=1; i<=a.length-1; i++){
            //5.1冒泡排序优化,设置一个信号变量,赋值false
            boolean flag = false;
            //4.2内层循环控制每轮中相邻数组比较的次数,j代表的是数组的下标
            //从 0 开始  到a.length-i结束(每轮比较都会得出数组内最大元素的结果)  j++
            for(int j=0; j<a.length-i; j++){
                //4.3判断相邻的元素前一个是否大于后一个
                if(a[j] > a[j+1]){
                    //4.4满足条件的相邻元素交换位置
                    int t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                    //5.2如果flag的值变成true,则说明数组内还有相邻元素在互换位置
                    flag = true;
                }
            }
            //5.3如果flag的值还是false,则说明数组内没有相邻元素互换位置了,此时结束循环
            if (flag == false){
                break;
            }
            System.out.println("第"+i+"轮循环"+Arrays.toString(a));
        }
        //6.输出排序的最终结果
        System.out.println("排序结果为:"+Arrays.toString(a));
    }
在Shell脚本中,数组的初始化可以通过多种方法完成。首先,可以使用静态定义的方法。方法一是直接使用等号将数组元素赋值,并用空格分隔开。例如,array=(1 2 3)可以初始化一个包含三个元素的数组。方法二是使用索引来给数组元素赋值,可以在括号内使用等号将索引与元素对应起来。例如,array=(=one =two =three)可以初始化一个包含三个元素的数组。方法三是逐个给数组元素赋值,可以使用索引来指定元素的位置。例如,array=a array=b array[2]=c可以初始化一个包含三个元素的数组。 另外,还可以从标准输入中读取内容来初始化数组。例如,下面的示例代码展示了如何通过读取机型和版本号来初始化数组: declare -a mach #数组声明 i=0 while read -p "Enter the 机型,结束请直接输入回车:" m do if [ -z $m ] then break; fi mach[$i]=${m} read -p "Enter ${mach[$i]} 版本号:" v ver[$i]=$v let i++ done 这段代码会循环读取用户输入的机型和版本号,然后将它们分别存储在名为mach和ver的数组中,实现了从标准输入给数组初始化的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Shell 数组](https://download.csdn.net/download/weixin_38677046/14893469)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [shell 数组的初始化](https://blog.csdn.net/zsj1126/article/details/111647975)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值