数组

  • 数组的概述
  • 一维数组的创建与使用
  • 创建一维数组
  • 初始化一维数组
  • 使用一维数组
  • 二维数组的创建及使用
  • 二维数组的创建
  • 二维数组的初始化
  • 使用二维数组
  • 二分法查找
  • 数组排序算法
  • 冒泡排序
  • 选择排序
  • Array工具类的使用


数组的概述

数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
数组的长度一旦确定,就不能修改. 我们可以直接通过下标(或索引)的方式调用指定位置的元素。数组的下标从0开始。
数组的分类:
按照维度:一维数组、二维数组、多维数组
按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)

一维数组的创建与使用

创建一维数组

数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量的数据类型。一维数组的创建有一些两种方式。
1.先声明,再使用new关键字进行内存分配
声明方式:
数组元素类型 数组名字[];
数组元素类型 [] 数组名字;
例如:int arr[];
为数组声明内存空间:
数组名字=new 数组元素类型[数组元素的个数];
例如:arr=new int[5];
2.声明数组的同时为数组分配内存空间
数组元素类型 数组名=new 数组元素类型[数组元素的个数];
例如:int month=new month[12];

初始化一维数组

数组的初始化就是给数组中每个元素赋值
数组初始化的两种形式:
int arr[]=new int[]{1,3,56,7};
int arr2[]={23,67,99,11}

使用一维数组

练习1:使用一维数组将1-12月各月天数输出

public class ArrayTest {
    public static void main(String[] args) {
		int day[]={31,28,31,30,31,30,31,31,30,31,30,31};
		for(int i=0;i<day.length;i++){
			System.out.println((i+1)+"月有"+day[i]+"天");
		}
	}
   
}

练习2:从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
成绩>=最高分-10 等级为’A’
成绩>=最高分-20 等级为’B’
成绩>=最高分-30 等级为’C’
其余 等级为’D’

import java.util.Scanner;

public class ArrayTest2 {
    public static void main(String[] args) {
		System.out.println("请输入学生人数:");
		Scanner sc=new Scanner(System.in);
		int sCount=sc.nextInt();
		int arr[]=new int[sCount];
		System.out.println("请输入"+sCount+"个成绩:");
		Scanner sc1=new Scanner(System.in);
		for(int i=0;i<arr.length;i++){
			arr[i]=sc1.nextInt();
		}
		int max=arr[0];
		for(int j=0;j<arr.length;j++){
			if(max<arr[j])max=arr[j];
		}
		System.out.println("最高分是:"+max);
		for(int i=0;i<arr.length;i++){
			if(arr[i]>=max-10){
				System.out.println("学生"+(i+1)+"的成绩是:"+arr[i]+",等级是A!");
			}else if(arr[i]>=max-20){
				System.out.println("学生"+(i+1)+"的成绩是:"+arr[i]+",等级是B!");
			}else if(arr[i]>=max-30){
				System.out.println("学生"+(i+1)+"的成绩是:"+arr[i]+",等级是C!");
			}else{
				System.out.println("学生"+(i+1)+"的成绩是:"+arr[i]+",等级是D!");
			}
		}

	}
   
}
请输入学生人数:
5
请输入5个成绩:
56
74
89
41
89
最高分是:89
学生1的成绩是:56,等级是D!
学生2的成绩是:74,等级是B!
学生3的成绩是:89,等级是A!
学生4的成绩是:41,等级是D!
学生5的成绩是:89,等级是A!

二维数组的创建及使用

二维数组的创建

二维数组可以看作是特殊的一维数组,与一维数组一样同样有两种创建方式
1:先声明,再使用new关键字进行内存分配
声明方式:
数组元素类型 数组名字[][];
数组元素类型[][] 数组名字;
例如: int arr[][];
为数组分配内存空间
arr=new int[2][5];
2:声明数组的同时分配内存空间
int arr2[][]=new int[2][5];

二维数组的初始化

二维数组的初始化与一维数组类似,同样可以使用大括号完成。
声明语法如下:
type arrayname[][]={value1,value2,…valuen}

使用二维数组

练习1:使用二维数组输出一个3行4列且所有元素都是*的矩阵

public class ArrayTest3 {
   public static void main(String[] args) {
	String arr[][]={{"*","*","*","*",},{"*","*","*","*",},{"*","*","*","*",}};
	for(int i=0;i<arr.length;i++){
		for(int j=0;j<arr[i].length;j++){
			System.out.print(arr[i][j]);
		}
		System.out.println();
	}
   }
}
****
****
****

练习2:使用二维数组打印一个10行杨辉三角

public class ArrayTest4 {
   public static void main(String[] args) {
	   int[][] yangHui=new int[10][];
	   for(int i=0;i<yangHui.length;i++){
		   yangHui[i]=new int[i+1];
		   yangHui[i][0]=yangHui[i][i]=1;
			   for(int j=1;j<yangHui[i].length-1;j++){
				   yangHui[i][j]=yangHui[i-1][j-1]+yangHui[i-1][j];
			   }
	   }
	   
	   for(int i=0;i<yangHui.length;i++){
		   for(int j=0;j<yangHui[i].length;j++){
			   System.out.print(yangHui[i][j]+"  ");
		   }
		   System.out.println();
	   }
   }
}
1  
1  1  
1  2  1  
1  3  3  1  
1  4  6  4  1  
1  5  10  10  5  1  
1  6  15  20  15  6  1  
1  7  21  35  35  21  7  1  
1  8  28  56  70  56  28  8  1  
1  9  36  84  126  126  84  36  9  1

二分法查找

前提:所要查找的数组必须有序
假设待查找的有序数列为1,3,5,7,9,11,19,21,25,我们要找的元素为19,请用二分查找算法找到对应的下标元素

public class ArrayTest5 {
	
  public static void main(String[] args) {
	int []arr=new int[]{1,3,5,7,9,11,19,21,25};
	int dest=19;
	int head=0;
	int end=arr.length-1;
	while(head<=end){
		int middle=(head+end)/2;
		if(dest==arr[middle]){
			System.out.println(dest+"对应的下标元素为:"+middle);
			break;
		}else if(arr[middle]>dest) {
			end=middle-1;
		}else{
			head=middle+1;
		}
	}
}
}

数组排序算法

冒泡排序

基本思想:
冒泡排序的基本思想是对比相邻的元素值,如果满足条件就交换元素值,把较小的元素移动到数组前面,把较大的元素移动到元素后面(也就是交换两个元素的位置),这样较小的元素就像气泡一样从底部上升到顶部。

java数组取数据结构 java数组总结_java


代码实现:

public class BubbleSort {
    public static void main(String[] args) {
		int []arr={63,1,24,77,45,3};
		System.out.println("原数组为:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println();
		for(int i=1;i<arr.length;i++){
			for(int j=0;j<arr.length-1;j++){
				if(arr[j]>arr[j+1]){
					int temp=arr[j];
					arr[j]=arr[j+1];
					arr[j+1]=temp;
				}
			}
		}
			
	    System.out.println("排序后的数组为:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
	}
}

选择排序

基本思想:
选择排序的基本思想是将指定排序位置与其他数组元素分别对比,如果满足条件就交换元素值。与冒泡排序区别,不是交换相邻元素,而是满足条件的元素与指定的排序位置交换。

java数组取数据结构 java数组总结_一维数组_02


代码实现:

public class SelectSort {
    public static void main(String[] args) {
		int []arr={63,1,24,77,45,3};
		System.out.println("原数组为:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println();
		int index;
		for(int i=1;i<arr.length;i++){
			index=0;
			for(int j=1;j<=arr.length-i;j++){
				if(arr[j]>arr[index]){
					index=j;
				}
			}
			int temp=arr[arr.length-i];
			arr[arr.length-i]=arr[index];
			arr[index]=temp;
		}
			
	    System.out.println("排序后的数组为:");
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
	}
}

Array工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。

boolean equals(int[] a,int[] b)

判断两个数组是否相等

String toString(int[] a)

输出数组信息

void fill(int[] a,int val)

将指定值填充到数组之中

void sort(int[] a)

对数组进行排序

int binarySearch(int[] a,int key)

对排序后的数组进行二分法检索指定的值

使用Array工具类进行数组排序

import java.util.Arrays;
   public class SortTest {
      public static void main(String[] args) {
           int [] numbers = {5,900,1,5,77,30,64,700};
           Arrays.sort(numbers);
        for(int i = 0; i < numbers.length; i++){
        System.out.println(numbers[i]); } 
        }
 }