JAVA编程学习记录(数组)

第三周:学习数组

数组概念:

数组是存储同一种数据类型多个元素的集合,也可以看成是一个容器。它既可以存储基本数据类型,也可以存储引用数据类型。

数组的定义格式:

格式1:数组类型 [ ] 数组名;//定义了一个int类型的数组变量a

格式2:数据类型 数组名 [ ];    //定义了一个int类型的变量a数组

//两种格式写法读法不一样,但表达的效果一样,都是定义了一个数组,推荐使用第一种,因为可读性更强。

数组初始化:

Java中的数据必须先初始化,然后才能使用,所谓初始化就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

1.动态初始化:

初始化时只指定数组长度,数组中的元素值由系统默认给定;

格式:    数据类型 [ ] 数组名 = new 数据类型[数组长度];

 数组长度其实就是数组中元素的个数。    

举例: int a =new int [3];//定义一个int类型的数组,这个数组中可以存放3个int类型的值;

如何获取元素值呢?这里再次引入数组中一个很重要的特点:就是如何取得数组中的元素呢?
数组为每个元素都分配了编号,从0开始。获取的时候只要数组名配合编号即可。最大编号是长度-1。这个编号专业叫法称:索引。

2.静态初始化:

初始化时指定每个数组元素的初始值,数组的长度由系统给定;

格式:    数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};

举例:int[] arr = new int[]{1,2,3};

定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别是1,2,3;

简写:int[] arr = {1,2,3};

数组常见异常

1.ArrayIndexOutOfBoundsException:数组角标越界异常(数组索引越界)

出现的原因:访问了数组中不存在的索引值;

解决方案:观察数组中到底有索引值到多少;  数组长度-1(数组名.length-1)

2.NullPointerException:空指针异常 (在实际开发中该异常是最多的)

出现的原因:对象为null,而开发者还要去使用对象,就会出现问题

解决方案:给某个对象进行非空判断,防止程序程序空指针异常

为什么要记住这些小问题呢?

因为写程序不仅仅是把代码写出来,还包括出现问题后要能够及时的把问题解决。而排错也应该是我们的基本功。所以,我们也应该记住一些常见的问题,以及出错原因和解决方案。

将遇见到的异常建立文档,记录出现该异常的原因以及如何解决异常!

实例练习:

遍历数组:

public class ArrayTest {
	public static void main(String[] args) {
		int [] arr= {1,2,3,4,5};
		//遍历数组
		for(int i=0;i<5;i++) {
			System.out.println(arr[i]);
		}
		System.out.println("---------华丽的分割线---------");
		//如果数组中元素非常多,难以统计元素个数,可采用数组属性:length
		int [] arr2= {1,2,3,4,5,6,7,8,9};
		for(int i=0;i<arr2.length;i++) {
			System.out.println(arr2[i]);
		}
	}
}

获取数组中的最值:

public class ArrayTest {
	public static void main(String[] args) {
		int [] arr= {5,4,2,3,1};
		//定义参照量,假设max为最大值
		int max=arr[0];
		//同理最小值
		int min=arr[0];
		/**
		 * 依次与max比较,大于max时将该元素赋值给max
		 * 以此来获取最值
		 */
		for(int i=0;i<arr.length;i++) {
			if(arr[i]>max)
				max=arr[i];
		}
		System.out.println("最大值为:"+max);
		//最小值获取同理
		for(int i=0;i<arr.length;i++) {
			if(arr[i]<min)
				min=arr[i];
		}
		System.out.println("最小值为:"+min);
	}		
}

逆序元素:

public class ArrayTest {
	public static void main(String[] args) {
		int [] arr= {5,4,2,3,1};
		//遍历逆序输出一次
		reverse(arr);
		printArry(arr);
		//遍历再逆序,输出原数组
		reverse2(arr);
		printArry(arr);
	}
	//定义一个逆序方法,方式1
	public static void reverse(int [] arr) {
		
		for(int i=0;i<arr.length/2;i++) {
			int temp=arr[i];
			arr[i]=arr[arr.length-1-i];
			arr[arr.length-1-i]=temp;
		}
	}
	//方式2
	public static void reverse2(int [] arr) {
		for(int start = 0,end = arr.length-1 ; start<=end ;start++,end --) {
			//temp中间变量
			int temp=arr[start] ;
			arr [start]=arr[end] ;
			arr [end]=temp ;
		}
	}
	//遍历数组
	public static void printArry(int [] arr) {
		System.out.print("[");
		for(int x = 0 ; x < arr.length ; x ++) {
			//是否是最后索引对应的元素
			if(x==arr.length -1) {
				System.out.println(arr[x] +"]");
			}else {
				System.out.print(arr[x] +", ");
			}
		}
	}
}

根据键盘录入索引查找对应星期:

public class ArrayTest{
	
	public static void main(String[] args) {
				
		//定义一个字符串数组
		String[] str = {"星期一","星期二","星期三","星期四","星期五","星期六","星期天"} ;
		
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;
		
		//接收数据
		System.out.println("请输入一个数据:(0-6):");
		int index = sc.nextInt() ;
		
		System.out.println("你要查找的是:"+str[index]);
	}
}

数组元素查找:

public class ArrayTest5 {
	
	public static void main(String[] args) {
		
		//定义一个数组:
		int[] arr = {200,250,38,101,300} ;
		//需求1:查找250这个元素在数组中第一次出现的索引
		int index = findIndex(arr, 250) ;
		System.out.println("250元素在数组中第一次出现的索引是:"+index);
		//	//需求2:查找2500这个元素在数组中第一次出现的索引
		int index2 = findIndex(arr, 2500) ;
		System.out.println("2500元素在数组中第一次出现的索引是:"+index2);
		int index3 = getIndex(arr, 38) ;
		System.out.println("index3:"+index3);
		int index4 = getIndex(arr, 380) ;
		System.out.println("index4:"+index4);
	}
	
	/**
	 * 定义一个查找数组中元素的方法
	 * 两个明确
	 * 		1)返回值类型:int
	 * 		2)参数类型:int [] arr ,两个参数, 第二个参数:int value
	 */
	public static int findIndex(int[] arr,int value) {
		//遍历arr数组元素
		for(int x = 0 ; x < arr.length ; x ++) {
			//判断:如果查找的元素恰好就是value值,那么直接返回该索引
			if(arr[x] == value) {
				return x ;
			}
		}
		//不但要考虑找到的情况,还要考虑到找不到的情况
		//在Java中,数组查找元素,如果找不到,返回-1 ,(找不到)
		return - 1;
	}
	//方式2,假设法
	public static int getIndex(int[] arr,int value) {
		//如果没有找到这个元素,假设找不到
		int index = -1 ;
		//遍历数组
		for(int x = 0 ;  x < arr.length ; x ++) {
			//获取到每一个元素,如果找到,修改索引值
			if(arr[x] == value) {
				//修改
				index = x ;
				break ;
			}
		}
		return index ;
	}
}

二维数组    

格式

数据类型 [ ] [ ] 数组名 = new 数据类型 [m] [n] ;

m:代表当前二维数组中有多少个一位数组;

n:代表每一个一位数组的长度;

m,n 必须为正整数;

例如:String str [ ] [ ] = new String [3] [4];    //可以看做一个3行4列的数组

另外两种格式

数据类型 [ ] 数组名 [ ] = new 数据类型[m] [n];

数据类型 数组名 [ ] [ ] = new 数据类型 [m] [n];

定义数组

 1.数据类型 [ ] [ ] 数组名 = new 数据类型 [m] [n] ;

给定一维数组的个数和每个数组的长度;

2.数据类型 [ ] [ ] 数组名 = new 数据类型[m][ ];

只给定一维数组的个数,每一个一维数组的长度动态给定;

3.数据类型[ ] [ ] 数组名称 = {{元素1,元素2,元素3},{....},{......}} ;    //静态初始化

例如:int [ ] [ ] arr = {{1,2,3},{4,5,6},{7,8}};

二维数组的遍历
public class ArrayTest {
	public static void main(String[] args) {
		//定义一个二维数组,静态初始化
		int [][] arr = {{1,2,3},{4,5,6},{7,8,9}};
		//调用方法
		printArray(arr);
	
	}
	//写一个遍历方法
	public static void printArray(int [][]arr){
		for(int x=0;x<arr.length;x++) {
			for(int y=0;y<arr[x].length;y++) {
				System.out.print(arr[x][y]+" ");
			}
		}
	}
}

数组高级部分

1. 冒泡排序

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名“冒泡排序”。

两两比较,大的往后放,第一次比较完毕,最大值出现在最大索引出

package 冒泡排序;

public class BubbleSortDemo {

	public static void main(String[] args) {
		// 定义数组
		int[] arr = { 12, 15, 14, 13, 16, 11 };
		// 调用排序方法
		bubbleSort(arr);
		// 调用遍历方法
		printSort(arr);
	}

	// 冒泡排序方法
	public static void bubbleSort(int[] array) {
		for (int i = 0; i < array.length - 1; i++) {
			for (int j = 0; j < array.length - 1 - i; j++) {
				if (array[j] > array[j + 1]) {
					int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
				}
			}
		}
	}

	// 遍历功能
	public static void printSort(int[] arr) {
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				System.out.println(arr[i] + "]");
			} else {
				System.out.print(arr[i] + ",");
			}
		}
	}
}
2. 选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。

选择排序: 用0索引对应的元素依次后面索引对应的元素进行比较, 1索引..... 小的数据往前方法,就可以得到一个排好序的数组

package 选择排序;

public class SelectionSort {

	public static void main(String[] args) {
		//定义数组
		int[] arr = {21,23,22,25,24,26};
		//调用排序方法
		selsctionSort(arr);
		//调用遍历输出
		printSort(arr);
		
	}
	//选择排序方法
	public static void selsctionSort(int []arr) {
		for (int i = 0; i < arr.length-1; i++) {
			for (int j = i+1; j < arr.length; j++) {
				if(arr[i]>arr[i+1]) {
					int temp = arr[i];
					arr[i] = arr[j];
					arr[j] = temp;
				}
			}
		}
	}

	// 遍历功能
	public static void printSort(int[] arr) {
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				System.out.println(arr[i] + "]");
			} else {
				System.out.print(arr[i] + ",");
			}
		}
	}
}
练习
package ArrayTest;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 把字符串中的字符进行排序。
 * 		举例:"dacgebf"
 * 		结果:"abcdefg"
 * 
 * 分析:
 * 		1)键盘录入一个字符串"dacgebf"
 * 		2)可以将字符串转换成字符数组
 * 		3)冒泡排序 
 * 		4)最终要字符串类型的数据
 *
 */

public class ArrayTest {

	public static void main(String[] args) {

		// 创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		// 接收数据
		System.out.println("请输入一个字符串");
		String line = sc.nextLine();

		// 字符串转字符数组
		char[] ch = line.toCharArray();
		// 调用排序方法
		bubbleSort(ch);
		// 转为字符串类型输出
		String str = Arrays.toString(ch);
		System.out.println(str);

	}

	// 冒泡排序
	public static void bubbleSort(char[] ch) {

		for (int i = 0; i < ch.length; i++) {
			for (int j = 0; j < ch.length - 1 - i; j++) {
				if (ch[j] > ch[j + 1]) {
					char temp = ch[j];
					ch[j] = ch[j + 1];
					ch[j + 1] = temp;
				}
			}
		}
	}
}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值