当前位置:   article > 正文

JAVA基础04-循环,数组以及排序算法

JAVA基础04-循环,数组以及排序算法

目录

循环语句

循环的控制语句

数组的使用

数组的知识点掌握

数组的声明

数组对象的创建

多维数组的定义和创建

数组的初始化以及内存分析

 内存分析总结

数组排序及其操作

冒泡排序

选择排序

练习(二分查找)

数组工具类的使用


循环语句

循环中具备哪些要素?初始化的变量、条件、循环执行体、迭代

while

先判断再执行

do while

不管条件是否成立都会执行一次 如果条件成立则继续执行

for

for(初始化;条件;迭代)

foreach

for(临时变量:数据源)


练习

阶乘

  1. import java.util.Scanner;
  2. public class Test1 {
  3. public static void main(String[] args) {
  4. // 通过Scanner 获取一个整数,然后使用while计算这个整数的阶乘
  5. // N的阶乘等于 N* (N-1) * (N-2) * ... * 1
  6. Scanner sc = new Scanner(System.in);
  7. // 获取一个数值
  8. int n = sc.nextInt();
  9. System.out.print(n);
  10. // 定义一个结果
  11. int result = n;
  12. // 循环进行乘积 5*4*3*2*1
  13. while(n>1) {
  14. //迭代
  15. n--;
  16. //求取乘积
  17. result = result*n;
  18. }
  19. //打印输出结果
  20. System.out.println("的阶乘结果为:"+result);
  21. }
  22. }

实现9*9的乘法表

  1. public class Test2 {
  2. public static void main(String[] args) {
  3. // 9*9的乘法表
  4. //外循环:遍历9次--相当于打印每一行的乘法表
  5. for(int n=1;n<=9;n++) {
  6. //内循环:遍历n次--打印当前行的n个乘法表式
  7. for(int i=1;i<=n;i++) {
  8. //格式化输出
  9. System.out.printf("%d*%d=%d \t",i,n,(i*n));// 其中\t为转义字符,制表符~
  10. }
  11. //换行
  12. System.out.println();
  13. }
  14. }
  15. }


循环的控制语句

break语句

结束、退出循环

  1. public class ForController {
  2. public static void main(String[] args) {
  3. // 1、break语句
  4. //当i==5时,则结束循环,不再输出
  5. for (int i = 1; i <= 10; i++) {
  6. //
  7. if(i==5) {
  8. break;
  9. }
  10. //
  11. System.out.println(i);
  12. }
  13. }
  14. }
 

continue语句

忽略当前循环,继续下一个循环操作

  1. //2、continue语句
  2. //当i==5时,则跳过当前循环,再继续下一次循环【忽略当前循环所剩下的操作】
  3. for (int i = 1; i <= 10; i++) {
  4. if(i==5) {
  5. continue;
  6. }
  7. System.out.println(i);
  8. }

return语句

结束方法,不再执行剩下的所有操作

  1. //3、return语句
  2. //当i==5时,则结束方法
  3. for (int i = 1; i <= 10; i++) {
  4. if(i==5) {
  5. return;
  6. }
  7. System.out.println(i);
  8. }

label标签语句

label标签是结合控制语句一起使用的

label语法格式: 标签名:

  1. //标签--标记label 应用在多重循环嵌套中的流程控制 语法格式为 标识符:
  2. outside:
  3. //当k==5时,结束整个多重循环
  4. for (int i = 1; i <= 10; i++) {
  5. System.out.println("i="+i);
  6. for (int k = 1; k <= 10; k++) {
  7. if(k==5) {
  8. continue outside;
  9. }
  10. System.out.println(k);
  11. }
  12. }
  13. System.out.println("main方法结束了!");

练习

打印1-100,忽略3和5的倍数

水仙花

  1. public class ForControllerTest {
  2. public static void main(String[] args) {
  3. //打印 1-100 之间的数,如果这个数是3或者5的倍数,就忽略掉
  4. for(int i=1;i<=100;i++) {
  5. if(i%3==0||i%5==0) {
  6. continue;
  7. }
  8. System.out.print(i+"\t");
  9. }
  10. System.out.println();
  11. //水仙花数定义:寻找所有的水仙花数
  12. for(int i=100;i<=999;i++) {
  13. //求取百十个的数值
  14. int bai = i/100;
  15. int shi = (i/10)%10;
  16. int ge = i%10;
  17. //计算并且判断是否满足条件
  18. if((bai*bai*bai+shi*shi*shi+ge*ge*ge)==i) {
  19. System.out.println(i);
  20. }
  21. }
  22. }
  23. }

数组的使用

数组的知识点掌握

1、声明数组、创建数组对象、数组的数据访问【索引-内存】

2、遍历数组【for、foreach】

3、数组的内存存储原理

数组的声明

  1. int[] arr;//推荐使用这种方式
  2. int arrs[];

数组对象的创建

  1. //2、如何创建数组对象[必须要指定数组的长度]【固定长度】
  2. //--静态形式:
  3. int[] arres = {1,2,3,4,5,6};
  4. //--动态形式
  5. int[] arres1 = new int[]{1,2,3,4,5,6};
  6. int[] arres2 = new int[6];
  7. //通过索引访问数组中的数据,注意是从0开始的
  8. System.out.println(arres[2]);

多维数组的定义和创建

多维数组就是一个数组中包含多个数组

创建数组对象会默认初始化 引用类型默认为null

索引代表的含义:new int[3][3]; 第一个索引表示的是多少个一维数组,第二个索引表示一维数组中有多少个数据

  1. //多维数组的创建
  2. int[][] arrays = {
  3. {1,2,3},{4,5,6},{7,8,9}
  4. };
  5. // ArrayIndexOutOfBoundsException 数组的索引越界

注意数组越界异常:ArrayIndexOutofBoundsException

数组的遍历

  1. //1、普通的for
  2. for(int i=0;i<arres.length;i++) {//一维
  3. System.out.println(arres[i]);
  4. }
  5. //外循环遍历二维中的一维数组
  6. for(int i=0;i<arrays.length;i++) {//二维
  7. //内循环遍历一维数组中的数组
  8. for(int k=0;k<arrays[i].length;k++) {
  9. System.out.println(arrays[i][k]);
  10. }
  11. }
  12. //2、foreach
  13. for (int is : arres) {//一维 \用is遍历arres数组的每个数据
  14. System.out.println(is);
  15. }
  16. for (int[] is : arrays) {//二维
  17. for (int i : is) {
  18. System.out.println(i);
  19. }

数组的初始化以及内存分析

 

 内存分析总结

1、变量是在栈内存中定义的,里面存放的是数组的引用地址

2、数组是一个引用类型、数组是一个对象数据,存放在堆内存中的

3、一维数组:

【基本数据类型】:当前堆内存块中直接存放该数值

【引用类型】:当前堆内存块中存放是该引用类型的对象地址

4、多维数组:

当前堆内存块中存放是该子数组的对象引用地址


数组排序及其操作

冒泡排序

  1. import java.util.Arrays;
  2. public class ArrayDemo1 {
  3. public static void main(String[] args) {
  4. /*
  5. * int[] arr = new int[6]; for (int i : arr) { System.out.println(i); }
  6. */
  7. // 每次操作后,确定一位【冒一次泡】
  8. //重复地走访过要排序的元素列,依次比较两个相邻的元素
  9. int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };
  10. // 没确定一位之后,下一次操作的比较次数减少一次
  11. // 具体要操作多少次?(n-1);每次操作要比较多少轮?(n-i)
  12. for (int n = 0; n < arr.length - 1; n++) {// 0~6
  13. // 每次操作要比较(n-i)轮
  14. for (int i = 0; i < arr.length - n - 1; i++) {// 0~6
  15. // 当前面的大于后面的则需要交换
  16. if (arr[i] > arr[i + 1]) {
  17. int item = arr[i];
  18. arr[i] = arr[i + 1];
  19. arr[i + 1] = item;
  20. }
  21. }
  22. }
  23. //遍历输出
  24. for (int i : arr) {
  25. System.out.println(i);
  26. }
  27. }
  28. }

选择排序

  1. //选择排序
  2. //方法一:将第一个与其后面所有数值进行比较,第二个也是如此
  3. for (int n = 0; n < arr.length - 1; n++) {// 0~6 起始位置
  4. // 每次操作要比较多少轮(n-1)?[内循环作为后面的遍历] 起始位置n和后面的比较
  5. for (int i = n+1; i < arr.length; i++) {// 1~7 2~7 3~7
  6. // 当起始位置大于后面的则需要交换
  7. if (arr[n] > arr[i]) {
  8. int item = arr[i];
  9. arr[i] = arr[n];
  10. arr[n] = item;
  11. }
  12. }
  13. }
  14. //然后输出
  15. //方法二:找出最小的数值与首位交换~
  16. //定义一个索引,用于保存当前最小的数值的位置
  17. int index = 0;
  18. for (int n = 0; n < arr.length - 1; n++) {// 0~6 起始位置
  19. index = n;//初始化起始位置的索引
  20. // 每次操作要比较多少轮(n-i)?[内循环作为后面的遍历] 起始位置n和后面的比较
  21. for (int i = n+1; i < arr.length; i++) {// 1~7 2~7 3~7
  22. // 当后面的小于index位置的数值则将该索引赋值给index
  23. if (arr[i] < arr[index]) {
  24. index = i;
  25. }
  26. }
  27. //交换:把最小的和起始位置的数值进行交换
  28. int item = arr[n];
  29. arr[n] = arr[index];
  30. arr[index] = item;
  31. }

练习(二分查找)

  1. import java.util.Arrays;
  2. public class BinarySearchTest {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };
  6. //使用工具类进行排序
  7. Arrays.sort(arr);
  8. System.out.println(Arrays.toString(arr));
  9. //实现二分查询逻辑操作
  10. int key = 45;
  11. //中间值索引
  12. int index = 0;
  13. //查询范围
  14. int start = 0;
  15. int end = arr.length;
  16. //设置一个标志位:
  17. boolean isFind = false;
  18. //循环
  19. while(start<=end) {
  20. //计算中间索引
  21. index = (end+start)/2;
  22. //进行判断操作【==、>、<】
  23. if(key==arr[index]) {
  24. System.out.println("找到目标索引为:"+index);
  25. //
  26. isFind = true;
  27. //结束
  28. break;
  29. }else if(arr[index]>key) {//缩小范围
  30. end = index-1;
  31. }else {
  32. start = index+1;
  33. }
  34. }
  35. if(!isFind) {
  36. System.out.println("没有找到目标索引");
  37. }
  38. }
  39. }

数组工具类的使用

数组工具类封装了数组的一些通用操作:

排序(升序)

  1. int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };
  2. //是升序排序 [1, 5, 43, 45, 64, 65, 101, 978]
  3. Arrays.sort(arr);

复制(copyof)

  1. //拷贝数组
  2. int[] arr3 = Arrays.copyOf(arr, 3);
  3. System.out.println(Arrays.toString(arr3));
  4. //范围拷贝
  5. int[] arr4 = Arrays.copyOfRange(arr,1,5);
  6. System.out.println(Arrays.toString(arr4));

查找(二分查找法【必须要升序排序】)

  1. //二分查找法:升序排序,再进行二分之一查询
  2. System.out.println(Arrays.binarySearch(arr, 165));
  3. //根据范围进行查询 二分查询
  4. System.out.println(Arrays.binarySearch(arr, 5, 7, 65));

填充(fill)

  1. //fill填充
  2. Arrays.fill(arr, 110);
  3. Arrays.fill(arr,1,5, 110);
  4. System.out.println(Arrays.toString(arr));
  5. System.out.println(Arrays.toString(arr2));

toString(转换为字符串)

  1. int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };
  2. //toString将数组格式化为字符串
  3. System.out.println(Arrays.toString(arr));

equals (数组是否相等)

  1. import java.util.Arrays;
  2. //数组工具类的使用
  3. public class ArraysTool {
  4. public static void main(String[] args) {
  5. int[] arr = { 5, 101, 978, 43, 45, 64, 1, 65 };
  6. //比较数组是否相等:长度相等、顺序相等
  7. System.out.println(Arrays.equals(arr, arr2));
  8. }
  9. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/430883
推荐阅读
相关标签
  

闽ICP备14008679号