JavaSE学习笔记_第五章_数组

第5章 数组

1. 数组

1.1 为什么要使用数组

分类存放数据,便于查找。

1.2 数组的概念

数组:存放同一类型数据的容器空间。

1.3 数组的定义

  • 数组是一个变量,存储相同 数据类型 的一组数据。

数组的使用:

  1. 声明数组
  2. 初始化
  3. 赋值
  4. 使用

数组定义的三种方式:

  1. 数据类型[] 数组名 = new 数据类型[数组大小](推荐使用

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

  2. 数据类型[] 数组名 = {值1, 值2, 值3 …}

  3. 数据类型[] 数组名 = new 数据类型[]{值1, 值2, 值3 …}

数组常见的错误:

  • 数组越界
  • 空指针
  • 定义(数组存放的数据必须为同一数据类型的数据)

1.4 数组的内存模型

数组是一个引用变量,引用存放于栈中,具体数据存放于堆中。

Java 的堆栈模型。

总结:

  1. 数组是存放同一数据类型的容器空间
  2. 数组在定义时,一定要指定其具体大小
  3. 数组的下标是从 0 开始的
  4. 数组是一个引用变量,数组名可以看做是指向数组地址的一个引用
  5. 数组声明后,数组中的元素会有一个对应数据类型的初始值

1.5 数组相关的操作

  • 获取最值:最大值或最小值

    • public class GetMaxOrMin {
      
      	public static void main(String[] args) {
      		// 初始化一个数组,默认为数组中的第一个数
      		int[] nums = { 3, 13, 63, 11, 85, 1, 0, 78 };
      		// 定义初始的最大值和最小值
      		int max = nums[0];
      		int min = nums[0];
      		// 循环遍历比较
      		for (int i = 0; i < nums.length; i++) {
      			if (max < nums[i]) {
      				max = nums[i];
      			}
      			if (min > nums[i]) {
      				min = nums[i];
      			}
      		}
      		System.out.println("最大值:" + max);
      		System.out.println("最小值:" + min);
      	}
      
      }
      
  • 反转/数组拷贝

    • public class ArrayReverse {
      
      	public static void main(String[] args) {
      		// 初始化一个数组
      		int[] nums = { 3, 13, 63, 11, 85, 1, 0, 78 };
      		// 初始化结果数组
      		int[] numsReverse = new int[nums.length];
      
      		System.out.println("反转前:");
      		show(nums);
      
      		// 进行反置赋值
      		for (int i = 0; i < nums.length; i++) {
      			numsReverse[nums.length - i - 1] = nums[i];
      		}
      
      		System.out.println("\n反转后:");
      		show(numsReverse);
      	}
      
      	private static void show(int[] num) {
      		for (int i = 0; i < num.length; i++) {
      			System.out.print(num[i] + " ");
      		}
      	}
      }
      
  • 查表法:通过下标与值的对应关系实现功能

    • String[] weeks = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"};
      System.out.println(weeks[5]);
      
  • 基本查找:查找数组中是否含有某数值

  • 数组扩容及缩容(抓阄游戏的实现)

    • /**
       * 抓阄游戏的实现
       * 要求:
       * 将本班同学姓名储存在一个一维数组中,当按回车键时抓住一个同学,抓过的同学下次不能再被抓住
       * 分析:
       * 数组扩容及缩容,随机数的产生
       *
       * @author SuMo
       */
      public class Test_05_array {
      
          public static void main(String[] args) {
              lotNames();
          }
      
          private static void lotNames() {
              String[] names = {"张三", "李四", "王五", "陈六", "苏七", "杨八"}; // 参加游戏的所有同学姓名
              String[] lotNames = new String[1]; // 被抓阄抓到的人
      
              // 循环抓人
              Scanner input = new Scanner(System.in);
              System.out.println("开始游戏");
              do {
                  System.out.println("玩家名单:");
                  show(names); // 打印参赛者名单
                  System.out.print("游戏开始,点击回车,开始抓阄!");
                  input.nextLine(); // 获取回车键
                  // 产生随机数
                  int random = (int) (Math.random() * names.length);
                  // 根据产生的随机数作为数组小标,找到被抓住的人
                  System.out.println(names[random] + "被抓住了。");
      
                  // lotNamesd的扩容
                  // 将被抓住的人移入lotNames
                  lotNames[lotNames.length - 1] = names[random];
                  System.out.println("被抓住的名单:");
                  show(lotNames);
                  String[] temp = new String[lotNames.length + 1];
                  for (int i = 0; i < lotNames.length; i++) {
                      temp[i] = lotNames[i];
                  }
                  lotNames = temp;
      
                  // names的缩容
                  // 将被抓住的人移出names
                  for (int i = random; i < names.length - 1; i++) { // 将被抓住的人后的人都往前移,覆盖掉被抓住的人的位置
                      names[i] = names[i + 1];
                  }
                  temp = new String[names.length - 1];
                  for (int i = 0; i < temp.length; i++) {
                      temp[i] = names[i];
                  }
                  names = temp;
                  temp = null;
      
              } while (names.length != 0);
              System.out.println("全部被抓住,游戏结束。");
          }
      
          private static void show(String[] names) {
              for (String name : names) {
                  System.out.print(name + "\t");
              }
              System.out.println(); // 换行
          }
      }
      

1.6 二维数组

1.6.1 定义

二维数组就是数组的数组。二维数组的定义跟一维数组类似,总体分为两类:

1.直接给每一维分配空间

  • type[][] typeName = new type[typeLength1][typeLength2];
    
  • type 可以为基本数据类型和复合数据类型,arraylength1 和 arraylength2 必须为正整数,arraylength1 为行数,arraylength2 为列数。

2.从最高维开始,分别为每一维分配空间,例如:

  • String s[][] = new String[2][];
    s[0] = new String[2];
    s[1] = new String[3];
    s[0][0] = new String("Good");
    s[0][1] = new String("Luck");
    s[1][0] = new String("to");
    s[1][1] = new String("you");
    s[1][2] = new String("!");
    
1.6.2 行列互换

代码:

/**
 * 二维数组行列互换
 * 
 * @author SuMo
 *
 */
public class ArrayAxis {

	public static void main(String[] args) {
		// 初始化二维数组
		int[][] ints = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
		System.out.println("行列互换前:");
		showArray(ints);

		for (int i = 0; i < ints.length; i++) {
			// 二维数组行列互换,只需要交换上三角与下三角即可
			// 因此将 j 从 i + 1 开始进行循环,提高运算效率
			for (int j = i + 1; j < ints[i].length; j++) {
				// 使用中间变量进行交换
				int temp = ints[i][j];
				ints[i][j] = ints[j][i];
				ints[j][i] = temp;
			}
		}

		System.out.println("行列互换后:");
		showArray(ints);

	}

	/**
	 * 打印输出数组
	 * 
	 * @param ints 
	 *			待打印输出的数组
	 * 
	 */
	private static void showArray(int[][] ints) {
		for (int i = 0; i < ints.length; i++) {
			for (int j = 0; j < ints[i].length; j++) {
				System.out.print(ints[i][j] + " ");
			}
			System.out.println(); // 打印完每行进行换行操作
		}
	}

}

结果:

在这里插入图片描述

2. 算法

2.1 冒泡排序

/**
 * 冒泡排序
 * 顺序:从小到大或者从大到小
 *
 * @author SuMo
 */
public class BubbleSort {

    public static void main(String[] args) {
        int[] num = {10, 15, 42, 56, 35, 84, 52, 34}; // 初始数据
        int temp = 0; // 中间变量

        // 排序前
        System.out.println("排序前:");
        for (int i = 0; i < num.length; i++) {
            System.out.print(num[i] + "\t");
        }
        
        for (int i = 0; i < num.length - 1; i++) {
            for (int j = 0; j < num.length - 1 - i; j++) {
                // 二者二选一
                if (num[j] > num[j + 1]) { // 下沉(从小到大)
                    temp = num[j];
                    num[j] = num[j + 1];
                    num[j + 1] = temp;
                }
//                if (num[j] < num[j + 1]) { // 上浮(从大到小)
//                  temp = num[j];
//                  num[j] = num[j + 1];
//                  num[j + 1] = temp;
                }
            }
        }

        // 排序后
        System.out.println("\n排序后:");
        for (int i = 0; i < num.length; i++) {
            System.out.print(num[i] + "\t");
        }
    }

}

2.2 选择排序

/**
 * 选择排序
 *
 * @author SuMo
 */
public class SelectSort {

	public static void main(String[] args) {
		int[] array = { 15, 54, 62, 32, 45, 58, 2, 99 }; // 初始数据
		int temp = 0; // 中间变量
		int currentIndex = 0; // 记录最小值的位置

		// 排序前
		System.out.println("排序前:");
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + "\t");
		}

		for (int i = 0; i < array.length - 1; i++) {
			currentIndex = i; // 初始化位置
			for (int j = i + 1; j < array.length; j++) {
				if (array[j] < array[currentIndex]) { // 通过比较,找出剩余数据中的最小值的位置
					currentIndex = j;
				}
			}
			if (i != currentIndex) { // 如果 i 不等于 currentIndex ,就需要进行位置交换
				temp = array[i];
				array[i] = array[currentIndex];
				array[currentIndex] = temp;
			}
		}

		// 排序后
		System.out.println("\n排序后:");
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + "\t");
		}
	}

}

2.3 二分查找

待查找的源数据必须有序且递增!!!

/**
 * 二分查找(又称折半查找)
 *
 * @author SuMo
 */
public class BinarySearch {

	public static void main(String[] args) {
		int[] array = { 20, 25, 31, 45, 52, 63, 74, 85, 92, 97 };
		binarySearch(0, array.length, 9, array);
	}

	/**
	 * 二分查找方法(递归)
	 *
	 * @param leftIndex
	 *            数组最小下标
	 * @param rightIndex
	 *            数组最大下标
	 * @param value
	 *            需要查找的数值
	 * @param array
	 *            待查找的数组(该数组必须是一个有序序列(从小到大))
	 */
	static void binarySearch(int leftIndex, int rightIndex, int value,
			int[] array) {
		int middleIndex = (leftIndex + rightIndex) / 2; // 中间下标
		int middleValue = array[middleIndex]; // 中间值

		if (leftIndex <= rightIndex) {
			if (middleValue == value) { // 找到
				System.out.println("成功找到该值:" + value + ",位置:" + middleIndex);
			} else if (middleValue > value) { // 未找到,往左边走
				binarySearch(leftIndex, middleIndex - 1, value, array);
			} else { // 未找到,往右边走
				binarySearch(middleIndex + 1, rightIndex, value, array);
			}
		} else {
			System.out.println("未找到该值:" + value);
		}
	}

}

3. 初始调试(Debug)

断点:使程序暂停下来的地方

Eclipse:

  • F5:进入方法(函数)内部
  • F6:单步调试,一句一句的执行语句
  • F7:跳出当前方法(函数)
  • F8:多步调试,直接跳到下一个断点处

IDEA:

  • F7:相当于 Eclipse 中的 F5
  • F8:相当于 Eclipse 中的 F6
  • Shift + F8:相当于 Eclipse 中的 F8,也相当于 Eclipse 中的 F7

认真、沉着做事,每天进步一小点!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值