java基础5

1.循环的使用

1.1do…while循环

dowhile语法规则:
语句0 ;
do{
语句1;//循环体
语句2;//
}while (循环条件);
语句3 ;  
import java.util.Random;
import java.util.Scanner;
// do ... while : 先做一次,然后判断是否需要继续做下一次。
// do { // 循环体} while {};
public class DoWhile {
	public static void main(String[] args) {
		// 让用户输入数据。判断输入的数据,如果不是30,就继续输,如果是30,就结束循环
		Scanner scanner = new Scanner(System.in);
		int data;
		do{
			System.out.println("请输入一个整数");
			data = scanner.nextInt();
		}while(data !=30);

		Random random = new Random();
		// 练习: 产生一个随机整数1~100的, 如果这个数 能同时被3,和 7整除,就输出符合条件的
// 这个数据。
		int n;
		do {
			n = random.nextInt(100)+1;
			if (n % 3 == 0 && n % 7== 0){
				break;
			}
		}while (true);
		System.out.println(n);
	}
}

1.2循环结构—while/do…while流程对比

image-20230723180626432

1.3循环结构——死循环

循环没有指明结束条件的情况会造成死循环

public static void main(String[] args) throws Exception {
   // 练习: 每隔1秒输出时间
   // 因为使用的直接量“true”,程序在编译的时候就知道是死循环,检查到后续的代码没有机会被执行到;
   boolean flag = true;
   while (flag) {
      Date date = new Date();// 年月日时分秒
      System.out.println(date);
      Thread.sleep(1000);// 等待1000毫秒
   }
   // 死循环
   int i = 0;  // 21亿 溢出
   for(;i >=0; i++){
      System.out.println(i);
   }
}

1.4嵌套循环

外层走一次,内层走所有次
建议循环层数越少越好

// 输出2-100之间的质数,保存到数组中
public class Demo3 {
   public static void main(String[] args) {
      for(int num = 2; num <= 100; num++) {// 循环判断2~100之间的每个数据
         // 使用数据从开始。逐渐和自己的平方根开始取余运算,如果没有能被整除的,说明是质数
         boolean flag = true; // 用于标识是否为质数: true质数, false 不是质数
         for(int j = 2; j <= Math.sqrt(num); j++) {
            if( num % j == 0 ) {
               flag = false;
               break; // 只要有一个能被整除的,就说明不是质数了,就提前结束这个循环的运行。
            }
         }
         if( flag ) { // 内层循环结束,还没有把flag修改为false, 说明i是质数
            System.out.println(num + "是质数。");
         }
      }
   }
}

1.5冒泡排序

所谓的冒泡算法就是从左往右依次比较两个数大小,若前一个数大于后一个数,则两个数交换位置

image-20230723182046989

import java.util.Arrays;
import java.util.Random;
// 冒泡排序
public class Demo4 {
   public static void main(String[] args) {
      // 创建一个整数数组,随机赋值,然后对这个数组,升序排序。
      Random random = new Random();
      int[] arr = new int[6];
      for (int i = 0; i < 6; i++) {
         arr[i] = random.nextInt(50)+1;
      }
      System.out.print("原数组:"+Arrays.toString(arr));
      // 升序
      int temp;
      for(int i = 0 ; i < arr.length-1; i++){// 只比较长度-1次
         for(int j = 0; j < arr.length-1-i ; j++){// 前面i个数已经升序,不用在比较  (后面的排好序的元素,不用重复排了)
            if(arr[j] > arr[j+1]){
               temp = arr[j];
               arr[j] = arr[j+1];
               arr[j+1] = temp;
            }
         }
      }
      System.out.print("\n"+"排序后:"+Arrays.toString(arr));
   }
}

2.数组的使用

程序=算法+数据结构,

算法:解决问题的步骤,或者叫流程(顺序,分支,循环)

数据结构:将数据按照某种特定的结构保存。

数组是一种最基本的数据结构。

image-20230723182546118

2.1什么是数组

  • 数组:相同数据类型的元素组成的集合

  • 元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素; 除最
    后一个元素外,每一个元素都有唯一的后继元素(“一个跟一个”),可以通过元素所在位置的顺序号
    (下标)做标识来访问每一个元素(下标从0开始,最大到元素的个数-1)

    image-20230723182659350

2.2数组的声明

  • 声明数组的语法:

    数据类型[] 数组名 = new 数据类型[大小];

image-20230723182753825

  • 数组声明的要点

    • -确切的数据类型

    • -整体的数组名字

    • -不能缺少的“[]”

    • -执行new语句才使得数组分配到了指定大小的空间

    • -int[] arr 与 int arr[]两种写法均可

    • -申明数组时不规定数组长度,new关键字分配空间时需要指定分配的空间大小

  • 数组初始化

    数组的初始化主要有以下3种:
    eg:
    int[ ] arr = new int[ 3 ];
    int[ ] arr = {1,2,3,4};
    int[] arr = new int[ ]{1,2,3,4};

    1.定义的时候初始化

    int[] arr = new int[4];
    int[] arr = {1,4,7};
    int[] arr = new int[]{2,4,6,8}

    2.定义之后再初始化

    int[] arr;
    arr = new int[5];
    arr = new int[]{1,2,3}//正确
    arr= {1,4,6};//错误

    3.数组声明的默认值

    数组new之后,每个元素都有默认值。int,long默认值为0,double默认值为0.0,
    boolean默认值为false,char默认值为空字符。

import java.util.Arrays;
public class ArrayDemo {
   public static void main(String[] args) {
      int[] a1 = {1,2,3,4,5,6}; // 表示元素是整数的数组,数组长度是6
      // int[] a2 = new int[];  // 编译错误: 没有指定数据的长度
      int[] a2 = new int[]{1,2,3}; // 表示元素是整数的数组,数组长度是3
      int[] a3 = new int[4];  //  表示元素是整数的数组,数组长度是4,并且初始化值都是0

      // 先定义,在初始化
      int[] a4;
      // a4 = {1,2,3,4}; // 编译错误: ***如果先定义了引用,再赋值,不能使用{}的方式
      a4 = new int[]{1,2,3,4,5}; //
      a4 = new int[8];// 没有给元素赋值,元素默认值是0  [0, 0, 0, 0, 0, 0, 0, 0]
      // 数组的默认值
      System.out.println("a4: " + Arrays.toString(a4));
      char[] a5 = new char[6];  // [ ,  ,  ,  ,  ,  ]
      System.out.println("a5: " + Arrays.toString(a5));
      String[] a6 = new String[6];  // [null, null, null, null, null, null]
      System.out.println("a6: " + Arrays.toString(a6));
      double[] a7 = new double[6];  // [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
      System.out.println("a7: " + Arrays.toString(a7));
      boolean[] a8 = new boolean[6];  // [false, false, false, false, false, false]
      System.out.println("a8: " + Arrays.toString(a8));
   }
}

2.3数组访问

  • 获取数组的长度

​ int[] arr = {1,3,5} ;

​ int len = arr.length; //3

  • 通过下标访问数组

​ arr[0]=20,arr[1]=30,arr[2]=40;

  • 数组的遍历(正序或逆序)
import java.util.Arrays;
public class ArrayDemo2 {
   public static void main(String[] args) {
      // 产生'A' ~ 'Z'的字符,然后随机找出一个字符
      char[] cs = new char[26];
      for(int i =0; i < cs.length; i++) {
         cs[i] = (char)('A' + i);
      }
      System.out.println(Arrays.toString(cs));
      int index = (int)(Math.random() * 26);
      System.out.println("随机字符:" + cs[index]);
   }
}

2.4数组复制

  • JDK提供对数组进行复制的方法,即将一个数组(源数组)中的各个元素值复制到另一个数组(目标数组)中:

image-20230723184350155

import java.util.Arrays;
// 数组的复制: 指定从某个数组的位置开始,复制数据,把复制的数据放到另一个数组中的某个位置,并且设置需要复制的个数
// *** 数组的复制,并没有产生新的数组。主要是修改了数组中的元素。
public class ArrayCopyDemo {
   public static void main(String[] args) {
      int [] arr = {1, 2,3,4,5,6,7,8,9,10};
      // 希望把arr的前五个元素放在arr1数组中,后五个元素放在arr2中
      int[] arr1 = new int[arr.length / 2];
      int[] arr2 = new int [arr.length / 2];
      System.arraycopy(arr, 0, arr1, 0, arr.length/2);
      System.arraycopy(arr, 5, arr2, 0, arr.length/2);
      // System.out.println("arr1: " + Arrays.toString(arr1));
      //    // System.out.println("arr2: " + Arrays.toString(arr2));
      // ** 自己写循环完成
      for(int i = 0; i < arr.length; i++) {
         if (i <= (arr.length-1)/2){
            arr1[i] = arr[i];
         }else {
            arr2[i - arr.length/2] = arr[i];
         }
      }
//    System.out.println("arr1: " + Arrays.toString(arr1));
//    System.out.println("arr2: " + Arrays.toString(arr2));

       // 练习: 把4~9, 复制给arr3;
      int[] arr3 = new int[6];
//    System.arraycopy(arr, 3, arr3, 0, arr3.length);
//    System.out.println("arr3: " + Arrays.toString(arr3));

      // 练习: arr4 = {1,2,3,0,0,0,0,0} .. 把arr中的4,5,6,7复制到arr4中的下标为3开始的地方
      int[] arr4 = {1,2,3,0,0,0,0,0};
      System.arraycopy(arr, 3, arr4, 3, 4);
      System.out.println("arr4: " + Arrays.toString(arr4));
   }
}

2.5数组扩容

  • 数组的长度在创建后不可以改变的。所谓“扩展”是指创建一个更大新数组,并将原有数组的内容复制到其中。
  • Jdk提供了一个方法,Arrays.copyOf 可以实现数组的“扩容

image-20230723184701741

package Day5;
import java.util.Arrays;
// 数组扩容
// 输出2-100之间的质数,保存到数组中
public class ArrayCopyDemo1 {
   public static void main(String[] args) {
      int[] arr = new int[0]; // 不知道质数的个数。找到一个质数,需要保存到数组中,我们就数组长度+1
      for(int num = 2; num <= 100; num++) {// 循环判断2~100之间的每个数据
         // 使用数据从2开始。逐渐和自己的平方根开始取余运算,如果没有能被整除的,说明是质数
         boolean flag = true; // 用于标识是否为质数: true质数, false 不是质数
         for(int j = 2; j <= Math.sqrt(num); j++) {
            if( num % j == 0 ) {
               flag = false;
               break; // 只要有一个能被整除的,就说明不是质数了,就提前结束这个循环的运行。
            }
         }
         if( flag ) { // 内层循环结束,还没有把flag修改为false, 说明i是质数
            arr = Arrays.copyOf(arr, arr.length+1);
            arr[arr.length-1] = num;

         }
      }
      System.out.println( "所有质数:" + Arrays.toString(arr));
   }
}

2.6数组排序

  1. 自定义排序方法:比如冒泡排序

  2. jdk种的Arrays.sort方法的使用

package Day5;

import java.util.Arrays;

// 排序
// Arrays.sort() -- jdk提供的排序方法
public class SortDemo {
  public static void main(String[] args) {
     int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};
     // arr = bubbleSort(arr);
     // System.out.println(Arrays.toString(arr));
     Arrays.sort(arr); // 排序
     System.out.println(Arrays.toString(arr));

     String[] strs = {"tom", "jack", "jerry", "rose","hanmeimei","小红"};
     Arrays.sort(strs);  // 单词首字母的编码排序,如果首字母相同,就第二个....
     System.out.println("strs:"+Arrays.toString(strs));// [hanmeimei, jack, jerry, rose, tom, 小红]
  }

  public static int[] bubbleSort(int[] arr) {
     for (int i = 0; i < arr.length-1; i++) {
        for (int j = 0; j < arr.length-1-i; j++) {
           if (arr[j] > arr[j+1]){
              int temp = arr[j];
              arr[j] = arr[j+1];
              arr[j+1] = temp;
           }
        }
     }
     return arr;
  }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值