Day04—数组
1、定义
数组是一个容器,可以同时存放多个数据;是存储相同数据类型的一组数据的集合
2、一维数组定义
(1)静态初始化:
在创建数组的同时并进行赋值操作。确定数组中的具体内容时使用。
//①数据类型[] 数组名 = new 数据类型[]{元素1,元素2.....};
int[] score = new int[]{77,78,99,56,67};
//②数据类型[] 数组名 = {元素1,元素2.....};
int[] score = {77,78,99,56,67};
(2)动态初始化:
不确定数组中的具体内容时使用
//①数据类型[] 数组名 = new 数据类型[数据的长度];
String[] names = new String[5];
//②数据类型 数组名[] = new 数据类型[数据的长度];
String names[] = new String[5];
//数据类型:空间大小; 数组名:这一组数据的统称; new:动作; 长度:数组的个数
(3)数组特点:
①数组是一个引用数据类型;
②数组一次存放多个值,数据类型必须相同(统一);
③数组的长度在程序运行期间不可以改变。
(4)常见问题:
①数组的溢出:访问数组元素时,下标编号不存在,会发生这种索引越界异常。
②空指针异常,不能直接使用未开辟堆内存空间的数组,数组必须进行初始化才可以使用。
(5)foreach循环(增强循环):
依次从数组取出各个元素,赋值给这个变量,同这个变量进行输出;变量的数据类型和数组一致。
/*
for (数据类型 变量 : 数组或集合){
}
*/
for(int i:arr){ //例如
}
(6)对数组的操作:
①求数组长度
public class Test1_ArrLength {
public static void main(String[] args) {
int[] arr = {4,6,2,9,6,1,12,65,3,34,47};
int len = arr.length; //获得arr2数组的长度
System.out.println("数组的长度为"+len);
}
}
②遍历数组
public class Test2_Arr {
public static void main(String[] args) {
int[] arr = {4,6,2,9,6,1,12,65,3,34,47};
for(int i = 0; i <arr.length; i++){ //快捷键(数组名.fori)如:arr.fori
System.out.println(arr[i]);
}
}
}
③获取最大、最小值
//foreach方法
public static void main(String[] args) {
int[] arr = {4,6,2,9,6,1,12,65,3,34,47};
int max = arr.length-1;
int min = arr[0];
for (int i:arr) {
if(i > max){
max = i;
}
if(i < min){
min = i;
}
}
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
}
//for循环方法
public static void main(String[] args) {
int[] arr = {4,6,2,9,6,1,12,65,3,34,47};
int max = arr.length-1;
int min = arr[0];
for(int i = 0; i < arr.length; i++){
if(arr[i] > max){
max = arr[i];
}
if(arr[i] < min){
min = arr[i];
}
}
System.out.println("最大值为:"+max);
System.out.println("最小值为:"+min);
}
④数组元素的反转
public class Test4_ArrReverse {
public static void main(String[] args) {
int[] arr = {4,6,2,9,6,1,12,65,3,34,47};
for (int i = 0; i < arr.length; i++) { //输出未反转前的数组
System.out.print(arr[i]+"\t");
}
System.out.println();
//数组反转
int center = arr.length / 2;
int head = 0; //前下标
int end = arr.length - 1;//后下标
for(int i = 0; i < center; i++){ //数据交换
int temp = arr[head];
arr[head] = arr[end];
arr[end] = temp;
head++; //往下一个数据走
end--;
}
for (int c : arr) { //打印反转后的数组
System.out.print(c+"\t");
}
System.out.println();
}
}
//简便方法(有缺陷)
public static void main(String[] args) {
int[] arr = {4,6,2,9,6,1,12,65,3,34,47};
for (int i = 0; i < arr.length; i++) { //输出未反转前的数组
System.out.print(arr[i]+"\t");
}
System.out.println();
for (int i = arr.length-1; i >= 0; i--) {
System.out.print(arr[i]+"\t");
}
}
⑤数组元素的查找
public class TestFind{
public static void main(String[] args) {
String[] arr = {"张三","李四","王五","徐三","赵四"};
Scanner input = new Scanner(System.in);
System.out.print("请输入您要查找的元素:");
String name = input.next();
int index = -1; //定义索引变量(找有没有要查找的元素)
for (int i = 0; i < arr.length; i++) {
if(name.equals(arr[i])){ //数组中比较字符串是否相等
index = i;
break;
}
}
if(index == -1){
System.out.println("没有您要查找的元素!");
}else{
System.out.println("您要查找的元素在"+index); //输出查询元素的下标
System.out.println(arr[index]);
}
}
}
⑥数组元素的添加
public class Test5_ArrAdd {
public static void main(String[] args) {
String[] arr = {"张三","李四","王五","徐三","赵四"};
Scanner input = new Scanner(System.in);
System.out.print("请输入您要添加的元素:");
String name = input.next();
String[] newArr = null; //声明一个新数组
if(arr[arr.length-1] != null){ //说明数组已满
newArr = new String[arr.length + 2]; //创建新容器
for (int i = 0; i < arr.length; i++) { //数据迁移(arr的值往newArr里迁移)
newArr[i] = arr[i];
}
arr = null; //指向arr数组的指向断开
}
//判断空位置
int index = -1;
for (int i = 0; i < newArr.length; i++) {
if(newArr[i] == null){
index = i;
break;
}
}
if(index != -1){
newArr[index] = name;
}else {
System.out.println("没有位置了!");
}
for (String n:newArr) {
if(n == null){
break;
}
System.out.print(n+"\t\t");
}
}
}
⑦数组元素的删除
public class Test5_ArrDel {
public static void main(String[] args) {
String[] arr = {"张三","李四","王五","徐三","赵四"};
Scanner input = new Scanner(System.in);
System.out.print("请输入您要删除的元素:");
String name = input.next();
int index = -1; //定义索引变量(找有没有要删除的元素)
for (int i = 0; i < arr.length; i++) {
if(name.equals(arr[i])){ //数组中比较字符串是否相等
index = i;
break;
}
}
System.out.println("******************删除之前*******************");
for (String a:arr) {
System.out.print(a+"\t\t");
}
if(index !=-1){ //说明有这个元素
//数据前移
for (int i = index; i < arr.length-1; i++) {
arr[i] = arr[i+1];
}
arr[arr.length-1] = null; //数组最后一个元素置空
System.out.println("\n******************删除之后*******************");
for (String a : arr) {
if(a == null){
break;
}
System.out.print(a+"\t\t");
}
}else{
System.out.println("没有你要删除的元素!");
}
}
⑧数组元素的插入
public class Test5_ArrInto {
public static void main(String[] args) {
String[] arr = {"张三","李四","王五","徐三","赵四",null};
Scanner input = new Scanner(System.in);
System.out.print("请输入您要插入的元素位置:");
int num = input.nextInt();
System.out.print("请输入您要插入的元素:");
String name = input.next();
//判断空位置
int index = -1;
for (int i = 0; i < arr.length; i++) {
if(arr[i] == null){
index = i;
break;
}
}
if(index != -1){
for(int i = arr.length-1; i > num; i--){
arr[i] = arr[i-1];
}
arr[num] = name;
for (String n:arr) {
System.out.print(n+"\t\t");
}
} else {
System.out.println("没有空位置!");
}
}
}
3、排序
(1)冒泡排序:两个相邻的元素依次进行比较,外层循环长度-1,内层循环长度-i -1
public class TestBubbleSort {
public static void main(String[] args) {
int[] arr = {92,77,11,89,9,66,26,19,33,6};
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;
}
}
}
System.out.println("输出排序后的数组:");
for (int j : arr) {
System.out.print(j+"\t");
}
}
}
(2)选择排序:选择一个固定的元素,和其他每个元素进行比较
public class TestSelectSort {
public static void main(String[] args) {
int[] arr = {92,77,11,89,9,66,26,19,33,6};
for (int i = 0; i < arr.length-1; i++) { //一次
for (int j = 1+i; j < arr.length; j++) { //一遍
if(arr[i] < arr[j]){ //比较
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println("输出排序后的数组:");
for (int j : arr) {
System.out.print(j + "\t");
}
}
}
(3)插入排序:将一组元素分成已排序和未排序两个区间,将未排序区间插入到已排序区间完成排序
public class TestInsertSort {
public static void main(String[] args) {
int[] arr = {92,77,11,89,9,66,26,19,33,6};
for (int i = 0; i < arr.length; i++) { //比较次数
int data = arr[i]; //变量
int index = i; //下标
while(index > 0){
if(data > arr[index-1]){
arr[index] = arr[index-1]; //赋值
}else{
break;
}
index--;
}
arr[index] = data; //插入数据
}
System.out.println("输出排序后的数组:");
for (int i : arr) {
System.out.print(i+"\t");
}
}
}
4、二维数组
(1)定义:
描述多行多列的结构,表结构。 一维数组中嵌套一维数组,形成二维数组。
(2)动态初始化
数据类型[][] 数组名 = new 数据类型 [行的长度][列的长度];
int[][] x = new int [2][3];
数据类型 数组名[][] = new 数据类型 [行的长度][列的长度];
int x[][] = new int [2][3];
(2)静态初始化
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2.....},{元素1,元素2.....}};
int[][] x = new int [][]{{1,2,3},{2,3,4},{3,4,5}};
数据类型[][] 数组名 = {{元素1,元素2.....},{元素1,元素2.....}};
int[][] x = {{1,2,3},{2,3,4},{3,4,5}};
5、Arrays类
(1)binarySearch(查询,底层使用二分查询,必须有序)返回元素在数组的下标
public class TestBinarySearch {
public static void main(String[] args) {
int[] arr = {9, 2, 3, 1, 5, 6, 4, 8, 7};
//排序
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 num = arr[j];
arr[j] = arr[j+1];
arr[j+1] = num;
}
}
}
System.out.print("输出排序后的数组:");
for (int i : arr) {
System.out.print(i + "\t");
}
System.out.println("\n查询的元素下标为:" + Arrays.binarySearch(arr,7));//第一个参数数组,查询的元素
}
}
(2)sort(数组) 排序 升序。
public class TestSort {
public static void main(String[] args) {
int[] arr = {92,77,11,89,9,66,26,19,33,6}; //无序
System.out.println("排序前的数组 :"+ Arrays.toString(arr));
/* Arrays.sort(arr,2,5);//给选定范围排序,起始位置包括,结束没有包括*/
Arrays.sort(arr); //升序排序(降序只能手写)
System.out.println("排序后的数组 :"+Arrays.toString(arr));
}
}
(3)fill(数组,值) 替换。
public class TestFill {
public static void main(String[] args) {
int[] arr = {92,77,11,89,9,66,26,19,33,6}; //无序
System.out.println("替换前的数组 :"+ Arrays.toString(arr));
Arrays.fill(arr, 2,5,100); //将下标2——5的元素替换为100
System.out.println("替换后的数组 :"+Arrays.toString(arr));
}
}
(4) equals(数组,数组) 比较
public class TestEquals {
public static void main(String[] args) {
String[] arr1 = {"apple", "banana", "orange"};
String[] arr2 = {"apple", "banana", "orange"};
System.out.println(Arrays.equals(arr1,arr2));
}
}
(5)copyOf(数组,长度) 复制
public class TestCopyOf {
public static void main(String[] args) {
int[] arr = {92,77,11,89,9,66,26,19,33,6};
int[] arr2 = {1,2,3,4,5};
int[] arr1 = Arrays.copyOf(arr, arr.length);
System.out.println("原数组:" + Arrays.toString(arr));
System.out.println("原样复制后的数组arr1:"+Arrays.toString(arr1));
System.arraycopy(arr,2,arr2,1,3); //把arr数组下标为2开始的数依次插入arr2数组下标为1——3范围内
System.out.println("复制后的数组arr2:"+Arrays.toString(arr2));
}
}