数组

package zjystudy.com.array;

import java.util.Arrays;

public class Dome03 {
   public static void main(String[] args) {
       int[] arrays = {1,2,3,4,5};

       //打印全部数组元素
       for (int i = 0; i < arrays.length; i++) {
           System.out.println(arrays[i]);
      }
       System.out.println("************************************");
       System.out.println(Arrays.toString(arrays));
       //计算所有元素和
       int sum = 0;
       for (int i = 0; i < arrays.length; i++) {
           sum += arrays[i];
      }
       System.out.println("sum = " + sum);

       //查找最大元素
       int max = arrays[0];

       for (int i = 0; i < arrays.length; i++) {
           if (arrays[i] > max) {
               max = arrays[i];
          }
      }
       System.out.println("max = " + max);
  }
}

递归使int类型数组反转

package zjystudy.com.array;

public class Dome04 {
   public static void main(String[] args) {
       int[] arrays = {1,2,3,4,5,6,7,8,9,10};
       printArray(arrays);
       reverse(arrays);
       printArray(arrays);

       //JDK1.5 没有下标 没有下标
//       for (int array : arrays) {
//           System.out.println(array);
//       }
  }
   //打印数组元素
   public static void printArray(int[] arrays){
       for (int i = 0; i < arrays.length; i++) {
           System.out.print(arrays[i] + "\t");
      }
  }

   //反转数组
   public static void reverse(int[] arrays){
       int len = arrays.length;
       //一个元素或者没有元素直接返回
       if (len <= 1){
           return;
      }else {
           re(arrays,0,len-1);
      }
  }
   //start指向交换的前部分,len指向交换的后部分
   public static void re(int[] arrays,int start,int len) {
       if (len - start > 2){
           re(arrays,start + 1,len -1);
      }
       int temp;
       temp = arrays[len];
       arrays[len] = arrays[start];
       arrays[start] = temp;
  }
}
package zjystudy.com.array;

import java.util.Arrays;

public class Dome05 {
   public static void main(String[] args) {
       int[] arrays = {1,2,3,4,5,6,7};
       System.out.println(Arrays.toString(arrays));
       System.out.println(Arrays.toString(reverse(arrays)));
  }
   //反转数组
   public static int[] reverse(int[] arrays) {
       int[] result = new int[arrays.length];

       //反转操作
       for (int i = 0,j = result.length-1; i < arrays.length; i++,j--) {
           result[j] = arrays[i];
      }
       return result;
  }
}

 

多维数组

  • 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。

  • 二维数组

    int a[][] = new int[2][5];
  • 解析:以上二维数组a可以看成一个两行五列的数组。

  • 思考:多维数组的使用?

    num[1][0]
package zjystudy.com.array;

public class Dome06 {
   public static void main(String[] args) {
       int[][][] array = {{{1,2,3},{7,8,9}},{{10,11,12},{13,14,15},{16,17,19}},{{20,21,22},{23,24,25},{26,27,28}},{{20,21,22},{23,24,25},{26,27,28}}};
       System.out.println(array);
       System.out.println(array.length);
       System.out.println(array[0].length);
       System.out.println(array[0][0].length);
       System.out.println("*************************************");
       for (int i = 0,count = 0; i < array.length; i++) {
           for (int j = 0; j < array[i].length; j++) {
               for (int k = 0; k < array[i][j].length; k++) {
                   System.out.print(array[i][j][k] + "\t");
                   count++;
                   if (count % 3 == 0){
                       System.out.println();
                  }
              }
          }
      }

  }
}

Attays类

  • 数组的工具类java.util.Arrays

  • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。

  • 查看JDK帮助文档

  • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是“不用”而不是“不能”)

 

  • 具有以下常用功能:

    • 给数组赋值:通过fill方法。

    • 对数组排序:通过sort方法,按升序。

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

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

紧急补充

在查看.chm文档时

CTRL + “-”      缩小

CTRL + “+”      放大

package zjystudy.com.array;

import java.util.Arrays;

public class Dome08 {
   public static void main(String[] args) {
       int[] a = {212,43,23,74,54,658,324,1};
       System.out.println(a);
       //打印数组元素
       System.out.println(Arrays.toString(a));

       Arrays.sort(a);//升序
       printArray(a);
       System.out.println("**************************");
       //数组填充,下标为2到4填充为0
       Arrays.fill(a,2,4,0);
       printArray(a);
  }
   public  static void printArray(int[] a){
       for (int i = 0; i < a.length; i++) {
           if (i == 0){
               System.out.print("[");
          }
           if (i == a.length - 1){
               System.out.print(a[i] + "]");
          } else {
               System.out.print(a[i] + ", ");
          }
      }
  }
}

冒泡排序

  • 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!

  • 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层一次比较,江湖中人人尽皆知。

  • 我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为O(n2)。

     


Java用sort实现对数组的降序排序

1.利用CollectionsreverseOrder

import java.util.*;

public class Main {
   public static void main(String[] args) {
//       注意这里是Integer,不是int
       Integer[] arr={9,8,7,6,5,4,3,2,1};
       Arrays.sort(arr,Collections.reverseOrder());
       for(int i:arr){
           System.out.println(i);
      }
  }
}

2.利用Comparator接口复写compare

import java.util.*;

public class Main {
   public static void main(String[] args) {
       Integer[] arr={9,8,7,6,5,4,3,2,1};
       Comparator cmp=new CMP();
       Arrays.sort(arr,cmp);
       for(int i:arr){
           System.out.println(i);
      }
  }
}
class CMP implements Comparator<Integer>{
   @Override //可以去掉。作用是检查下面的方法名是不是父类中所有的
   public int compare(Integer a,Integer b){
//       两种都可以,升序排序的话反过来就行
//       return a-b<0?1:-1;
       return b-a;
  }
}

稀疏数组

  • 有的二维数组的很多值是默认值0,因此记录了很多没有意义是数据。

  • 解决:稀疏数组

稀疏数组介绍

  • 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组。

  • 稀疏数组的处理方式是:

    • 记录数组一共有几行几列,有多少个不同值

    • 把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模

package zjystudy.com.array;

public class Dome09 {
   public static void main(String[] args) {
       //创建一个二维数组11 x 11   0:没有棋子 1:黑棋   2:白棋
       int[][] array1 = new int[11][11];
       array1[2][3] = 1;
       array1[4][5] = 2;
       //输出原始数组
       System.out.println("输出原始的数组");
       for (int[] ints:array1){
           for (int AnInt:ints){
               System.out.print(AnInt + ", ");
          }
           System.out.println();
      }

       System.out.println("**********************************");
       //转换为稀疏数组保存
       //获取有效值的个数
       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("稀疏数组");
       for (int i = 0; i < array2.length;i++) {
           System.out.println(array2[i][0] + "\t"
                            + array2[i][1] + "\t"
                            + array2[i][2] + "\t");
      }
       System.out.println("********************");
       System.out.println("还原");
       //1.读取稀疏数组
       int[][] array3 = new int[array2[0][0]][array2[0][1]];

       //2.给其中元素还原它的值
       for (int i = 1; i < array2.length; i++) {
           array3[array2[i][0]][array2[i][1]] = array2[i][2];
      }

       //3.打印
       System.out.println("输出还原的数组");

       for (int[] ints:array1) {
           for (int anInt : ints) {
               System.out.print(anInt + "\t");
          }
           System.out.println();
      }
  }
}
//稀疏数组:一句话,记录有效的坐标,与原始坐标的大小及其有效值。
输出原始的数组
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
**********************************
有效值个数:2
稀疏数组
11 11 2
2 3 1
4 5 2
********************
还原
输出还原的数组
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
posted @ 2020-10-19 23:20  0基础学Java  阅读(173)  评论(0)    收藏  举报