导航

数组

Posted on 2020-07-04 14:25  乔伊_413  阅读(114)  评论(0编辑  收藏  举报

5.数组

 //x/y=3...10  x+y+3+10=163 ?x&y
 package com;
 import java.util.Scanner;
 ​
 //一个项目中必须只存在一个main()方法
 public class Application {
     public static void main(String[] args) {
         double[] n = {1.1,1.2,1.3,1.4,1.5};//省略了new double[5]
         //遍历
         for (int i = 0; i < n.length; i++) {
             System.out.println(n[i]);//遍历
        }
         //计算和
         float sum =0;
         for (int i = 0; i < n.length; i++) {
             sum = (float) (sum+n[i]);
        }
         System.out.println(sum);
         //寻找最大值
         float max=0;
         for (int i = 0; i < n.length; i++) {
             if (n[i]>max){
                 max= (float) n[i];
            }
        }
         System.out.println(max);
         //增强for循环
         for (double i:
              n) {
             System.out.println("for_each"+i);
        }
         //倒叙
         for (int i = n.length - 1; i >= 0; i--) {
             System.out.println("倒叙"+n[i]);
        }
    }
 }

 

数组是具有相同数据类型的有序集合

每一个数据称为一个数组元素,通过下标来访问(下标0为第一个元素)

5.1数组的声明与创建

  1、首先必须声明数组变量,后方可使用:

 dataType[] arrayRefVar;  //首选的方法
 dataType arrayRefVar[];  //效果相同

  2、Java语言使用new操作符来创建数组

 dataType[] arrayRefVar = new dataType[arraySize];
 int[] a1 = new int[5];
 double[] a2 = new double[10];
 //x/y=3...10 x+y+3+10=163 ?x&y
 //x/y=3...10 x+y+3+10=163 ?x&y
 package com;
 import java.util.Scanner;
 ​
 //一个项目中必须只存在一个main()方法
 public class Application {
     public static void main(String[] args) {
         double[] nums = new double[5];
         double[] n = {1.1,1.2,1.3,1.4,1.5};//省略了new double[5]
         int[] num = new int[5];
         char[] c = new char[5];
         boolean[] b = new boolean[2];
         String[] s = new String[]{"hello","world","Come On!"};
 ​
 ​
         num[0] =1;
         num[1] =2;
         num[3]=3;
         nums[1]=1.2;
         System.out.println(num[2]);
         System.out.println(n[3]);
         System.out.println(nums[0]);
         System.out.println(s[0]);
         System.out.println(s.length);
         System.out.println(b[0]=true);
    }
 }

  3、数组的元素是通过索引访问的,数组索引从零开始。

  4、获取数组长度:

 arrays.length
 package com.hch.array;
 ​
 public class Demo01_array {
     //变量类型 变量名字   =   变量的值;
     public static void main(String[] args) {
         /**
          * 1、定义;声明一个数组
          * int[] nums1;
          * 2、创建一个数组
          * nums1 = new int[10];
          * int nums2[]; //定义2;了解。
          * */
         int[] nums1 = new int[10];  //声明创建一起完成
 ​
         //给数组元素赋值
         nums1[0] = 1;
         nums1[1] = 2;
         nums1[2] = 3;
         nums1[3] = 4;
         nums1[4] = 5;
         nums1[5] = 6;
         nums1[6] = 7;
 ​
         System.out.println(nums1[3]);
         System.out.println(nums1[7]);//未赋值的数组元素默认为0
 //       System.out.println(nums1[10]); 数组下标越界错误
 ​
         //计算所有的数组元素的和
         int sum = 0;
         //获得数组的长度   array.length
         for (int i = 0; i < nums1.length; i++) {
             sum = sum + nums1[i];
        }
         System.out.println(sum);
    }
 }

5.2 数组的基本特点

  1、长度确定;一旦创建,其大小不可变更;

  2、数组中元素数据类型必须相同;

  3、数据类型为任意包括基本类型和引用类型;

  4、数组变量属于引用类型;

  5、数组也可看作对象,其中的数组元素为该对象的成员变量;

  6、数组对象本身在

  7、下标合法区间:[0 , length-1],如果越界就会报错:ArrayIndexOutOfBoundsException:数组下标越界异常

5.3三种初始化

5.3.1静态初始化

 int[] a = {1,2,3};
 Man[] mans = {new Man(1,1),new Man(2,2)};

5.3.2动态初始化

 int[] a = new int[2];
 a[0] = 1;
 a[1] = 2;

5.3.3数组的默认初始化

·数组是引用类型;其元素相当于类的实例变量;因此数组一经分配空间,其中的每个元素被隐式初始化;

 package com.hch.array;
 ​
 public class Demo02_array {
 ​
     public static void main(String[] args) {
         //静态 初始化==>创建+赋值
         int[] a = {1,2,3};
         System.out.println(a[2]);
 ​
         //动态初始化(包含默认初始化)
         int[] b = new int[3];
         b[0] = 1;    
    }
 }
 ​

5.4数组的使用

普通for循环

 package com.hch.array;
 ​
 public class Demo03_array {
     public static void main(String[] args) {
         int[] array = {1,2,3,4,5};
         //遍历所有元素
         for (int i = 0; i < array.length; i++) {
             System.out.println(array[i]);
        }
         System.out.println("<=============>");
         //计算和
         int sum = 0;
         for (int i = 0; i <array.length ; i++) {
             sum = sum + array[i];
        }
         System.out.println(sum);
         System.out.println("<=============>");
         //查找最大元素
         int max = array[0];
         for (int i = 0; i < array.length; i++) {
             if (array[i] > max){
                 max = array[i];
            }
        }
         System.out.println(max);
    }
 }

 

For-Each循环

 package com.hch.array;
 //增强for循环 for-each
 public class Demo04_array {
     public static void main(String[] args) {
         int[] a ={1,2,3};
         //JDK1.5以上,没有下标
         /**
         
         */
         for (int i : a) {
             System.out.println(i);
        }
         printArray(a);
    }
 }

数组作为方法入参

 package com.hch.array;
 ​
 public class Demo04_array {
     public static void main(String[] args) {
 ​
         printArray(a);
     
    }
 ​
     //打印数组元素
     public static void printArray(int[] a){
         for (int i = 0; i < a.length; i++) {
             System.out.print(a[i]+" ");
        }
    }
 }
 ​

数组作为返回值

 package com.hch.array;
 ​
 public class Demo04_array {
     public static void main(String[] args) {
         int[] reverse = reverse(a);
         printArray(reverse);
    }
 
     //打印数组元素
     public static void printArray(int[] a){
         for (int i = 0; i < a.length; i++) {
             System.out.print(a[i]+" ");
        }
    }
 ​
     //反转数组
     public static int[] reverse(int[] a){
         int[] result = new int[a.length];
         //反转操作
         for (int i = 0,j = result.length -1 ; i < a.length; i++,j--) {
             result[j] = a[i];
        }
 ​
         return result;
    }
 }
 ​

5.5多维数组

“数组的数组,如:二维数组是一个特殊的一维数组”

二维数组:

 int a[][] = new int[2][4];
 package com.hch.array;
 ​
 public class Demo05_array {
     public static void main(String[] args) {
 //       int[][] array = new int[3][3];
         int[][] array = {{1,2},{3,4},{5,6}};
         System.out.println(array[2][0]);
    }
 }

5.6 Arrays类

数组的工具类:java.util.Arrays (查看JDK帮助文档)

Array类中的方法都是用static修饰的静态方法,在使用的时候直接使用类名来调用

功能:

  1、给数组赋值:通过fill方法

  2、对数组排序:通过sort方法,按升序

  3、比较数组:通过equals方法比较数组中元素值是否相等

  4、查找数组元素:通过binarySearch方法对排序好的数组进行二分查找操作

 package com.hch.array;
 ​
 import java.util.Arrays;
 ​
 public class Demo06_array {
     public static void main(String[] args) {
         int[] a = {1,5,7,34,543,234,1234};
 //       System.out.println(Arrays.toString(a)); 打印数组元素
 ​
         //对数组进行排序
         Arrays.sort(a);  //升序
         System.out.println(Arrays.toString(a));      
    }
 }

5.7 冒泡排序

八大排序之一:冒泡排序、选择排序、插入排序、快速排序、堆排序、希尔排序、归并排序、计数排序

两层循环;外层冒泡轮数;里层依次比较

 package com.hch.array;
 import java.util.Arrays;
 /**
  * 冒泡排序
  * 1、比较数组中两个相邻的元素,如果第一个比第二个大就交换位置
  * 2、每一次比较都会产生一个最大、或者最小的数字
  * 3、下一轮则可以少一轮排序
  * 4、依次循环,直到结束
  * */
 public class Demo07_array {
     public static void main(String[] args) {
         int[]  a = {1,45,43,7,65,234,12,11};
         int[] s = sort(a);
         System.out.println(Arrays.toString(a));
    }
 ​
     public static int[] sort(int[] array){
         int temp = 0;
         //外层循环,判断循环次数
         for (int i = 0; i < array.length-1; i++) {
             boolean flag = false;//通过flag标识,减少没有意义的比较
             //内层循环,判断大小则交换位置
             for (int j = 0; j < array.length-1-i; j++) {
                 if (array[j+1] < array[j]){   // < :从小到大 > : 从大到小
                     temp = array[j];
                     array[j] = array[j+1];
                     array[j+1] = temp;
                     flag = true;
                }
            }
             if (flag == false){
                 break;
            }
        }
         return array;
    }
 }

5.8扩展:稀疏数组

 package com.hch.array;
 ​
 public class Demo08_array {
     public static void main(String[] args) {
         //1、创建一个二维数组 0:没有棋子 1:黑棋 2:白棋
         int[][] array1 = new int[11][11];
         array1[1][2] = 1;
         array1[2][3] = 2;
         //输出原始数组
         for (int[] ints:
              array1) {
             for (int anInt:
                  ints) {
                 System.out.print(anInt+"\t");
            }
             System.out.println();
        }
         System.out.println("<==========================>");
         //转换为稀疏数组保存
         //1、获取有效值个数
         int sum = 0;
         for (int i = 0; i < 11; i++) {
             for (int j = 0; j < 11; j++) {
                 if (array1[i][j] != 0){
                     sum++;
                }
            }
        }
         System.out.println("有效值个数:"+sum);
         //2、创建一个稀疏数组
         int[][] array2 = new int[sum+1][3];
         array2[0][0] = 11;
         array2[0][1] = 11;
         array2[0][2] = sum;
         //3、遍历二维数组,将非零的值存放在稀疏数组中
         int count = 0;
         for (int i = 0; i < array1.length; i++) {
             for (int j = 0; j < array1[i].length; j++) {
                 if (array1[i][j] != 0){
                     count++;
                     array2[count][0] = i;
                     array2[count][1] = j;
                     array2[count][2] = array1[i][j];
                }
            }
        }
         System.out.println("<==========================>");
         System.out.println("稀疏数组:");
         //4、输出稀疏数组
         for (int i = 0; i < array2.length; i++) {
             System.out.println(array2[i][0]+"\t"+
                     array2[i][1]+"\t"+
                     array2[i][2]+"\t");
        }
    }
 }
 ​