数组
1.数组的概念
1.1什么是数组:
有相同的元素(类型)组成集合,叫数组。
1.2数组的特点:
- 数组的长度是固定的
- 数组的元素类型必须一样
- 数组的元素可以为基本数据类型,也可以是引用数据类型
- 数组本身就是一个引用类型数据
2.一维数组
2.1声明和创建数组
1)数组的声明:
- 第一种声明方式:数据类型 数组名[];
int ints[]; - 第二种声明数组的方式: 数据类型[] 数组名:(一般推荐使用第二种)
double[] dous; - 注意点:
数组的类型可以是基本数据类型,也可以是引用数据类型
2)数组的创建:
- 第一种创建方式: 先声明,后创建(创建==new)
float[] fls;
fls=new float[10];
- 第二种创建方式:声明的同时创建
char[] chars = new char[10];
- 第三种声明方式:直接赋值
String[] strs={" 今天","天气 ","非常 ","好 “,”!!! "};//strs数组的长度为5
2.2 数组的取值
- 数组是利用下标来取值的,取值的格式:数组名[下标值],数组的下标值是从0开始的,最大下标值(长度-1)
- 案例:计算张浩五门学科的总成绩
声明并且使用直接赋值的方式创建数组,定义成绩之和变量,使用循环将值去除并且累加,输出总和
int[] list = {55,66,77,88,99};
int sum = 0;
for(int i = 0;i < 5;i++){
sum = sum + list[i];
}
System.out.println("五门学科的总成绩:"+sum);
2.3数组的赋值
利用下标来赋值
- 案例:创建char类型的数组,将值存储进去
创建char类型的数组,长度为5,利用下标存储元素,将存储的值一一取出
char[] chars = new char[10];
chars[0]='a';
chars[1]='b';
chars[2]='c';
chars[3]='d';
chars[4]='e';
for(int i =0;i<5;i++){
System.out.println(chars[i]);
}
chars[4]='f';
for(int i=0;i<5;i++){
System.out.println(chars[i]);
}
2.4数组的长度
- 判断数组的长度:length属性
- 案例:
int[] ints = new int[5];
int i = ints.length;
System.out.println("数组的长度为: "+ i);
2.5遍历数组
- 概念
将数组里面的所有元素都显示出来 - 普通for循环遍历
- 格式:
for(int i = 0;数组长度;i++){
利用下标将元素输出;
} - 小案例:
- 格式:
String[] strs = {" 今天","天气 ","非常 ","好 ","!!! "};
for(int i = 0;i<strs.length;i++){
System.out.println(strs[i]);
}
- 增强for循环遍历‘
- for(数组的数据类型 变量名:数组名){
输出变量名即可;
}
-小案例:
- for(数组的数据类型 变量名:数组名){
String[] strs = {" 今天","天气 ","非常 ","好 ","!!! "};
for(String s:strs){
System.out.println(s);
}
- 案例
使用遍历的方式查看五位学员的成绩
创建数组和成绩变量,创建键盘输入对象,利用循环将元素存储,使用普通for循环或者增强for循环进行遍历
int[] scores = new int[5];
int s= 0;
Scanner input = new Scanner(System.in);
System.out.println("请输入5位学员的成绩:")
//利用循环输出元素
for(int i= 0;i<score.length;i++){
scores[i] = input.nextInt();
}
//普通for遍历
for(int i = 0;i<scores.length;i++){
System.out.println(scores[i]);
}
System.out.println("=======================")
//增强for遍历
for(int s1:scores){
System.out.println(s1);
}
- 注意点
使用for循环来遍历数组,所谓的遍历数组是指将数组中所有的元素全部打印在控制台上
float类型的数组的默认值为0.0
char的默认值为’’
引用数据类型的数组默认值为null
2.6注意点
- 数组是利用下标来取值的,取值的格式:数组名[下标值],数组的下标值是从0开始的,最大下标值为(长度-1)
- 数组的长度在创建时就已经确定了,不是在声明的时候,数组的长度一旦创建,就不能修改
- 数组的长度一旦确定,就不可改变,也就是说数组一旦创建,长度就已经确定,时无法进行长度的修改的
- 数组下标的取值范围为:0-(数组的长度-1)如果超出范围会报异常:java.lang.ArrayIndexOutOfBoundsException:数组下标越界异常,说明取值超出数组的长度
String[] strArrayDynamc = new String[4];
System.out.println(strArrayDynamc[1]);
//得到的是null
int[] intArrayDynamc = new int[5];
System.out.println(intArrayDynamc[0]);
//结果:0
Integer[] integerArrayDynamc = new Integer[5];
System.out.println(integerArrayDynamc[0]);
//结果:null
3.二维数组
3.1概念
本事就是数组中的数组(相当于两个一维数组的嵌套)
3.2 二维数组的声明和创建
- 声明:
- 第一种方式:(推荐使用)
int[][] ints; - 第二种方式:
char chars[][];
- 第一种方式:(推荐使用)
- 创建
- 第一种方式:声明的同时使用new关键之创建二维数组
double[][] dous = new double[4][5]; - 第二种方式:直接赋值
String[][] strs = {{“1”,“2”,“3”,“4”},{“5,”,“6”,“7”,“8”},{“9,”,“0”,“1”,“2”}};
- 第一种方式:声明的同时使用new关键之创建二维数组
3.3二维数组的遍历
- 普通for循环遍历二维数组
for(int i =0;i<strs.length;i++){
for(int j = 0;j<strs[i].length;j++){//j表示的是一维数组的下标值
System.out.println("strs["+i+"]["+j+"]="+strs[i][j]);
}
}
- 增强for循环遍历二维数组
for(String[] str : strs){//第一层遍历出来的是二维数组的元素,也就是一维数组
for(String s : str){//第二层遍历的是一维数组中的每个元素
System,out,println(s);
}
}
4.练习
4.1从键盘中任意输入一个数据,判断数组中是否包含此数
import java.sql.SQLOutput;
import java.util.Arrays;
import java.util.Scanner;
public class Practice4 {
public static void main(String[] args) {
int intArrays[] = {1,2,3,4,5};
Scanner input = new Scanner(System.in);
System.out.println("Please input a number: ");
int m = input.nextInt();
for(int i =0;i<intArrays.length;i++){
if(m==intArrays[i]){
System.out.println("此数组包含此数");
}
}
System.out.println(Arrays.toString(intArrays));
}
}
4.2统计4*5二维数组中奇数的个数和偶数的个数。
public static void main(String[] args) {
int[][] intArraysGroup = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};
//int a[][] =new int[4][5];
int odd=0;//奇
int even=0;//偶
// for (int i =0;i<3;i++){
// for (int j = 0;j<=4;j++){
// a[i][i]=input.nextInt();//输入
// }
for (int i = 0;i<4;i++){
for (int j =0;j<5;j++){
if (intArraysGroup[i][j]%2==0)
even++;
else
odd++;
}
}
System.out.println("奇数个数为: "+odd+",偶数个数为: "+even+" ");
}
4.3将数组的元素全部输出
System.out.println("==============for循环============");
if (strArrayStcTwo != null && strArrayStcTwo.length>0) {//断路与(前一个条件不成立就不再走后面的了)
//排除空数组,以及长度为0的数组
for (int i = 0; i < strArrayStcTwo.length; i++) {//加=号就会数组越界了,下标的问题
//考虑不周,万一数组是空的-》就会报错NUllPointerException空指针异常。所以要先判断
System.out.println(strArrayStcTwo[i]);//数组越界了
}
}
System.out.println("==========增强型的for循环");
for (String element : strArrayStcTwo){
System.out.println(element);
}
4.4输出最大值
int[] intArrayNum = {3,50,90,10,60};
//输出 数组内的最大值方法一
int max=0;
for (int i =0;i<intArrayNum.length-1;i++){
int k=intArrayNum[i];
int j= intArrayNum[i+1];
if(k>=j){
max=k;
}else{
max=j;
}
System.out.println(max);
}
System.out.println(max);
//输出 数组内最大值 方法二
int index = 0;//最大值索引号,默认为0
int max2 = intArrayNum[index];
for (int i =1; i<intArrayNum.length;i++){
if (intArrayNum[i]>max){
index = i;
max2 = intArrayNum[i];
}
}
System.out.println("最大值为"+max2+", 索引号为"+index);
//输出数组内最大值 方法三:for增强循环
int max3 = intArrayNum[0];
for (int ele : intArrayNum){
if (max3 < ele){
max3=ele;
}
}
System.out.println(String.format("最大值为:%s",max));
4.5冒泡排序:从小到大排序
冒泡排序是简单经典的排序算法,它重复地走访过要排序地元素,一次比较相邻地两个元素,如果他们的顺序错误就把他们调换过来,知道没有元素再需要交换,排序完成。名字由来:元素经由交换慢慢“浮”到数列顶端
冒泡排序算法:
1.比较相邻的元素,如果前一个比后一个大,就把他们两个调换位置
2.对每一对相邻元素作同样的哦你工作,从开始第一对到结尾的最后一对。这步做完之后,最后的元素会是最大的数
3.针对所有的元素重复以上步骤,除了最后一个
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
5.优点:
每进行一趟排序,就会少比较一次,因为每进行一趟排序就会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。
//方法一:
int index1=0;
int length = intArrayNum.length-1;
int k =0;
for (int i=0;i<intArrayNum.length;i++){
for (int j=i+1;j<intArrayNum.length;j++){
if (intArrayNum[i]>=intArrayNum[j]){
k = intArrayNum[i];
intArrayNum[i] = intArrayNum[j];
intArrayNum[j]=k;
}
length--;
}
}
for (int i=0;i<intArrayNum.length;i++){
System.out.println(intArrayNum[i]);
}
//方法二:
//确定循环次数:内循环循环次数:length-i-1,减的越来越多,
//每一层换几次,要确定下来。外层决定的是有六层,内循环决定的是一层里面换几次
//内层循环没搞明白!!!!
/*
* {3,10,30,50,26}/
* {3,10,30,26}//去掉50
* {3,10,26,30}
* {3,10,26}//去掉30
* {3,10}
* */
for (int i =0;i<intArrayNum.length-1;i++){
for (int j = 0;j<intArrayNum.length-i-1;j++){
if (intArrayNum[j+1] < intArrayNum[j]){
int tmp = intArrayNum[j];
intArrayNum[j] = intArrayNum[j+1];
intArrayNum[j+1] = tmp;
}
}
}
System.out.println(Arrays.toString(intArrayNum));
//方法三:用i--