多维数组

发布于:2022-12-20 ⋅ 阅读:(271) ⋅ 点赞:(0)

多维数组可以看成以数组为元素的数组,可以是二维、三维、甚至多维数组,但是实际在运用中,运用的很少,一般使用容器。

eg1.声明二维数组

public class Test{
    public static void main(String[] args){
    //在Java中多维数组的声明和初始化应从低维到高维的顺序进行
        int[][] a = new int[3][];
        a[0] = new int[2];
        a[1] = new int[4];
        a[2] = new int[3];
    //int a1[][] = new int[][4];  //错误/非法
    }
}

 eg2.二维数组的静态初始化

public class Test{
    public static void main(String[] args){
        int[][] a = {{1,2,3},{3,4},{3,5,6,7}};
        System.out.println(a[2][3]);
    }
} 

 eg3.二维数组的动态初始化

import java.util.Arrays;
public class Test{
    public static void main(String[] args){
        int[][] a = new int[3][];
    //a[0] = {1,2,3}; //错误,没有声明类型就初始化
        a[0] = new int[] {1,2};
        a[1] = new int[] {2,2};
        a[2] = new int[] {2,2,3,4};
    System.out,println(a[2][3]);
    System.out,println(Arrays.toString(a[0]));
    System.out,println(Arrays.toString(a[1]));
    System.out,println(Arrays.toString(a[2]));
    
    }
}

        

执行结果:

 

多维数组_Object数组存储表格数据

表格是计算机中最普遍的模型,能看到的所有数据本质上都是"表格";

 表格中的数据,每行可以使用一个一维数组存储:

Object[ ] a1 = {1001,高小六,30,英语老师,2-14};

Object[ ] a2 = {1002,高小七,31,数学老师,10-10};

Object[ ] a3 = {1003,高小八,32,语文老师,5-5};

Consideration:这里的基本数据类型1001,本质不是Object对象。JAVA编译器会自动把基本数据类型"自动装箱"成包装类对象。    在这里,我们需要再定义一个二维数组,将上面3个数组放入即可:

Object[ ] [ ] emps = new Object[3] [ ];

emps[0] = a1;

emps[1] = a2;

emps[2] = a3;

eg1.使用二维数组保存表格数据

import java.util.Arrays;
public class Test{
    public static void main(String[] args){
        Object[] a1 = {1001,"高小六",30,"英语老师","2-14"};
        Object[] a2 = {1002,"高小七",31,"数学老师","10-10"};
        Object[] a3 = {1003,"高小八",32,"语文老师","5-5"};
        Object[] [] emps = new Object[3][];
         emps[0] = a1;
         emps[1] = a2;
         emps[2] = a3;
    System.out.println(Arrays.toString(emps[0]));
    System.out.println(Arrays.toString(emps[1]));
    System.out.println(Arrays.toString(emps[2]));
    }
}


eg2.使用javabean和一维数组保存表格信息

import java.util.Arrays;
public class Test{
    public static void main(String[] args){
    Emp[] emps = {
        new Emp(1001,"高小六",30,"英语老师","2-14"),
        new Emp(1001,"高小七",31,"数学老师","10-10"),
        new Emp(1001,"高小八",32,"语文老师","5-5")};

for(Emp e:emps){
    System.out.println(e);
    }
  }
}


class Emp{
    private int id;
    private String name;
    private int age;
    private String job;
    private String hiredate;

public Emp(int id,String name,int age,String job,String hiredate){
    this.id = id;
    this.name = name;
    this.age = age;
    this.job = job;
    this.hiredate = hiredate;
   }
@Override
public String toString(){
    return "[" + id +"," + name + "," + age + "," + job + "," + hiredate +"]";
 }
public int getAge() {
   return age;
  }

  public void setAge(int age) {
   this.age = age;
  }

  public String getJob() {
   return job;
  }

  public void setJob(String job) {
   this.job = job;
  }

  public String getHiredate() {
   return hiredate;
  }

  public void setHiredate(String hiredate) {
   this.hiredate = hiredate;
  }
}

Comparable接口_对象的排序

多个对象做比较,就要有'"比较规则",然后实现排序,实际上,java中排序算法的底层也依赖Comparable接口。

Comparable接口中只有一个方法:

public int compare To(Object obj) obj 为要比较的对象

在方法中,将当前对象和obj这个对象进行比较,如果大于返回1,等于返回0,小于返回-1.(这里的1也可以是正整数,-1也可以是负整数)。compare To方法的代码也比较固定,如下:

public int compare To(Object o){
    Man man = (Man) o;
    if(this.age < man.age){
        return -1;
    }
    if(this.age > man.age){
        return 1;
    }
        return 0;
    }

 【测试Comparable接口】使用Arrays类对数组元素进行排序

import java.util.Arrays;
public class Test{
    public static void main(String[] args){
        Man[] msMans = {new Man(3,"a"),new Man(60,"b"),new Man(2,"c")};
        Arrays.sort(msMans);
        System.out.println(Arrays.toString(msMans));
    }
}

class Man implements Comparable{
    int age;
    int id;
    String name;

public Man(int age,String name){
    super();
    this.age = age;
    this.name = name;
    }
public String toString(){
    return this.name;
    }

public int compare To(Object o){
    Man man = (Man) o;
    if(this.age < man.age){
        return -1;
    }
    if(this.age > man.age){
        return 1;
    }
        return 0;
    }
}

冒泡排序算法

冒泡排序算法是较为常用的排序算法,推荐个网站https://visualgo.net/   (网站里面可以根据程序执行看到动画效果)

冒泡排序的基础算法

冒泡排序算法重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,这样越大的元素会经由交换慢慢"浮"到数列的顶端。

冒泡排序算法的运作如下:

①比较相邻的元素,如果第一个比第二个大,就交换他们两个。

②对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,在这里,最后的元素应该会是最大的数。

③针对所有的元素重复以上的步骤,除了最后一个。

④持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 eg1.冒泡排序的基础算法

import java.util.Arrays;
public class TestBubbleSort{
    public static void main(String[] args){
        int[] values = {3,1,6,8,9,0,7,4,5,2};
        bubbleSort(values);
        System.out.println(Arrays.toString(values));
    }

public static void bubbleSort(int[] values){
    int temp;
    for(int i = 0; i < values.length;i++){
        for(int j = 0; j < values.length -1 -i;j++){
            if(values[j]> values[j+1]){
                temp = values[j];
                values[j] = values[j+1];
                values[j+1] = temp;
                }
            }
        }
    }
}

冒泡排序的优化算法

其实上面的冒泡排序算法,走到第七趟的时候,排序已经完成,可以把上面的冒泡算法优化一下,基于冒泡排序的以下特点:

①整个数列分成两个部分:前面是无序数列,后面是有序数列。

②判断每一趟是否发生了数组元素的交换,如果没有发生,则说明此时数组已经有序,无需再进行后续趟数的比较了,此时就可以中止比较。

 eg2.冒泡排序的优化算法

import java.util.Arrays;
public class TestBubbleSort2{
    public static void main(String[] args){
        int[] values = {3,1,6,8,9,0,7,4,5,2};
        bubbleSort2(values);
        System.out.println(Arrays.toString(values));
    }
    public static void bubbleSort2(int[] values){
        int temp;

        for(int i = 0; i < values.length;i++){
       //定义一个布尔类型的变量,标记数组是否已达到有序的状态
        boolean flag = true;
    /*内存循环:每一趟循环都从数列的前两个元素开始进行比较,比较到无序数组的最后 */
        for(int j = 0; j < values.length -1 -i;j++){
       //如果前一个元素大于后一个元素,则交换两元素的值;
        if(values[j] > values[j + 1]){
            temp = values[j];
            values[j] = values[j + 1];
            values[j + 1] = temp;
       //本趟发生了交换,表明该数组再本趟处于无序状态,需要继续比较;
            flag = false;
        }
    }
       //根据标记量的值判断数组是否有序,如果有序,则退出;无序,则继续循环。
        if(flag){
            break;
            }
        }
    }
}

执行结果:

 二分法查找

二分法检索(binary search)又称折半检索

 数组[7,8,9,10,12,20,30,40,50,80,100]中查询10是否存在?

二分检索的基本思想是设数组中的元素从小到大有序地存放在数组(array)中,首先将给定值key与数组中间位置上元素的关键码(key)比较,如果相等,则检索成功;否则,若key小,则在数组前半部分中继续进行二分法检索;若key大,则在数组后半部分中继续进行二分法检索。这样,经过一次比较就缩小一半的检索区间,如此进行先去,直到检索成功或检索失败。

二分法检索是一种效率较高的检索方法。

eg.二分法查找法的基本算法

import java.util.Arrays;
public class TestBinarySearch{
    public static void main(String[] args){
        int[] arr = {30,20,50,10,80,9,7,12,100,40,8};
        int searchWord = 20;  //所要查找的数
        Arrays.sort(arr);  //二分法查找之前,一定要对数组元素排序
        System.out.println(Arrays.toString(arr));
        System.out.println(searchWord + "元素的索引:" + binarySearch(arr,searchWord));
    }
    public static int binarySearch(int[] array,int value){
        int low = 0;
        int  hight = array.length -1;
        while(low <= high){
        int middle = (low + high)/2;
        if(value == array[middle]){
            return middle;  //返回查询到的索引位置
        }
        if(value > array[middle]{
            low = middle + 1;
        }
        if(value < array[middle]){
         high = middle -1;
        }
      }
     return -1;  //上面循环完毕,说明未找到,返回-1
    }
}

执行结果如下:

 

本文含有隐藏内容,请 开通VIP 后查看