4.3. 数组的基本操作

4.3.1. 遍历数组

遍历一维数组

import java.util.*;

public class Rakel { // 创建类
    public static void main(String[] args) { // 主方法
        // 定义String型数组str
        String str[] = new String[]{"ab", "cd", "ef", "yz"};
        Arrays.sort(str); // 将数组进行排序

        for (int i = 0; i <str.length ; i++) {
            System.out.println(str[i]);
        }

        for (String i : str) {
            System.out.printf("%s \n", i);
        }

        // 在指定的范围内搜索元素"cd"的索引位置
        int index = Arrays.binarySearch(str, 0, 2, "cd");
        System.out.println("cd的索引位置是:" + index); // 将索引输出
    }
}

遍历二维数

遍历数组就是获取数组中的每个元素,通常使用for循环来实现,遍历二维数组需要使用双层for循环,通过length属性可获得数组的长度。

for循环

eg

public class array5 {
//  主方法
    public static void main(String[] args) {
//      定义二维数组
        int b[][] = new int[][] {{1},{2,3},{4,5,6}};
        for (int i = 0; i < b.length; i++) {
//          遍历二维数组中的每个元素
            for (int j = 0; j < b[i].length; j++) {
                System.out.println(b[i][j]);    //将数组中的元素输出
            }
            System.out.println();  //输出空格
        }
    }

}

使用foreach语句来遍历二维数组

eg

public class foreach_array1 {
    public static void main(String[] args) {
//  主方法
//  定义二维数组
    int arr2[][] = {{4,3},{1,2}};
//  打印提示信息
    System.out.println("数组中的元素是:");

//  定义外层循环计数器
    int i=0;
//  外层循环变量为以为数组
    for (int x[] : arr2) {
//      外层计数器递增
        i++;

        int j=0;        //定义内层循环计数器
        for (int e : x) {       //循环遍历每一个数组元素
            j++;            //内层计数器递增
            if (i==arr2.length && j==x.length) {    //判断二维数组中的最后一个元素
                System.out.print(e);        //输出二维数组的最后一个元素
            } else {
                //如果不是二维数组中的最后一个元素
                System.out.print(e+"、");    //输出信息
            }
        }

    }

}
}

4.3.2. 填充替换数组元素

数组中的元素定义完成后,可以通过Arrays类的静态方法fill()来对数组中的元素进行替换。 方法为:

fill(int[] a,int value)

a:要进行替换的数组
value:要存储数组中所有元素的值

eg

import java.util.Arrays;        //导入java.util.Arrays类
public class array6 {
    //主方法
    public static void main(String[] args) {
//      创建int型数组
        int arr[] = new int[5];
        Arrays.fill(arr, 8);  //使用同一个值对数组进行填充
        for (int i = 0; i < arr.length; i++) {      //循环遍历数组中的元素
//          将数组中的元素依次输出
            System.out.println("第"+i+"个元素是:"+arr[i]);
        }

    }

}

//输出结果
第0个元素是:8
第1个元素是:8
第2个元素是:8
第3个元素是:8
第4个元素是:8

注意:数组若原有值将会被覆盖。

eg 覆盖数组下标索引的范围

import java.util.Arrays;

public class test7 {
//  主方法
    public static void main(String[] args) {
//      定义数组
        int arr[]= {1,2,3,4,5,6,7,8};
//      填充替换数组索引范围2~4下标
        Arrays.fill(arr, 2, 4, 88);
//      遍历打印出数组的值
        for (int i = 0; i < arr.length; i++) {
            System.out.println("第"+i+"个元素的值是:"+arr[i]);
        }
    }

}

// 输出信息
第0个元素的值是:1
第1个元素的值是:2
第2个元素的值是:88
第3个元素的值是:88
第4个元素的值是:5
第5个元素的值是:6
第6个元素的值是:7
第7个元素的值是:8

注意:指定的索引位置大于或等于要进行填充的数组的长度。就会报出ArrayIndexOutif-BoundsException异常

eg: 隐藏电话号码的例子

import java.util.Arrays;

public class test8 {
public static void main(String[] args) {
//  定义电话号码的数组
    int arr[]= {1,3,2,6,2,6,6,2,2,1,6};

//  进行数组替换,repleace 2~6 index
    Arrays.fill(arr, 3, 7, 0);
    for (int i = 0; i < arr.length; i++) {
//      判断替换后为0的打印输出为*
        if (arr[i]==0) {
            System.out.print("*");
        }
        else {
//          原样输出数组
            System.out.print(arr[i]);
        }
    }
}
}
//输出结果
132****2216

4.3.3. 对数组进行排序

Arrays Sort()方法 Arrays.sort(arr);

int arr[] = new int[] {23,42,12,84} ;
Arrays.sort(arr);

eg:

import java.util.Arrays;

public class Array_sort {
//  主方法
    public static void main(String[] args) {
//  创建一个数组,无序的
    int arr1[]= new int[]{11,22,33,88,31,21,55};
//  对数组进行排序
    Arrays.sort(arr1);

//  打印排序后数组的值
    for(int tmp:arr1) {
        System.out.print(tmp + " ");

    }

    }
}

//输出结果
11 21 22 31 33 55 88

eg

import java.util.Arrays;

public class Array_sort {
//  主方法
    public static void main(String[] args) {
//  创建一个数组,无序的
//  int arr1[]= new int[]{11,22,33,88,31,21,55};
    double b[] = new double[] {12.0,1.1,22.2,44.6};
//  对数组进行排序
    Arrays.sort(b);

//  打印排序后数组的值
    for(double tmp:b) {
        System.out.print(tmp + " ");

    }

    }
}
//输出结果
1.1 12.0 22.2 44.6

sort()方法只有升序的一种结果。局限性很大

4.3.4. 复制数组

eg

public class array_copy {
    public static void main(String[] args) {
//      定义arr1数组
        int arr1[]= {1,2,3};

//      定义arr2数组
        int arr2[]=arr1;
        arr2[0]=88;
        System.out.println("arr1数组:");
//      打印arr1数组内容,遍历arr1
        for (int tmp:arr1) {
            System.out.print(tmp+" ");
        }
//      打印arr2数组内容,遍历arr2
        System.out.println("\narr2数组:");
        for (int tmp:arr2) {
            System.out.print(tmp+" ");
        }
    }

}


//输出内容
arr1数组:
88 2 3
arr2数组:
88 2 3

eg

import java.util.Arrays;

public class array_copy {
    public static void main(String[] args) {
//      定义arr1数组
        int arr1[]= {1,2,3};

//      定义arr2数组,内存中开辟了一个新的区域,2代表数组的长度,大于长度补充0,
        int arr2[]=Arrays.copyOf(arr1, 2);
        arr2[0]=88;
        System.out.println("arr1数组:");
//      打印arr1数组内容,遍历arr1
        for (int tmp:arr1) {
            System.out.print(tmp+" ");
        }
//      打印arr2数组内容,遍历arr2
        System.out.println("\narr2数组:");
        for (int tmp:arr2) {
            System.out.print(tmp+" ");
        }
    }

}


//输出结果
arr1数组:
1 2 3
arr2数组:
88 2

eg

import java.util.Arrays;

public class array_copy2 {
    public static void main(String[] args) {
//      定义arr1数组
        int arr1[]= {1,2,3,4,5,6,7,8};

//      定义arr2数组,内存中开辟了一个新的区域,copy 2~5索引的值
        int arr2[]=Arrays.copyOfRange(arr1, 2, 4+1);
        System.out.println("arr1数组:");
//      打印arr1数组内容,遍历arr1
        for (int tmp:arr1) {
            System.out.print(tmp+" ");
        }
//      打印arr2数组内容,遍历arr2
        System.out.println("\narr2数组:");
        for (int tmp:arr2) {
            System.out.print(tmp+" ");
        }
    }

}
// 输出结果
arr1数组:
1 2 3 4 5 6 7 8
arr2数组:
3 4 5

4.3.5. 数组的查询

import java.util.Arrays;

public class array_search1 {
//  主方法
    public static void main(String[] args) {
//      create array
        int arr1[]= {7,5,8,2,3,1,9};
        //将数组进行排序
        Arrays.sort(arr1);

//      查找数组中元素8的索引位置
        int index=Arrays.binarySearch(arr1, 8);
        System.out.println("8的索引位置是:"+ index);

    }

}
//输出结果
8的索引位置是:5

eg

import java.util.Arrays;

public class array_search2 {
//  主方法
    public static void main(String[] args) {
        //定义String型数组str
        String str[]= new String[] {"ab","cd","ef","yz"};
//      对数组进行排序
        Arrays.sort(str);

//      在指定范围内搜索元素"cd"的索引位置
        int index= Arrays.binarySearch(str, 0, 2, "cd");
//      输出索引位置
        System.out.println("cd 的索引位置是:"+ index);

    }

}

//输出信息
cd 的索引位置是:1

4.3.6. 数组排序

冒泡排序

eg

public class maopao_paixu {
//  主方法
    public static void main(String[] args) {
//      定义一个int型数组
        int a[]= {11,33,6,88,32,79,232};

//      遍历数组元素,遍历2次
        for (int i = 1; i < a.length; i++) {
            for (int j = 0; j < a.length-1; j++) {
                if(a[j]>a[j+1]) {
//                  将第1个位置的数和第2位置的数,互换位置
                    int tmp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=tmp;
                }
            }
        }
        System.out.println("冒泡排序的结果:");
        for(int tmp:a) {
            System.out.print(tmp+ "->");
        }

    }

}
//输出信息
冒泡排序的结果:
6->11->32->33->79->88->232->
if(a[j]<a[j+1]) {
//      将第1个位置的数和第2位置的数,互换位置
        int tmp=a[j];
        a[j]=a[j+1];
        a[j+1]=tmp;
    }
}
#可以实现降序,输出结果:
冒泡排序的结果:
232->88->79->33->32->11->6->

选择排序

选择排序的过程

eg

/**
 * 直接选择排序算法实例
 *
 * @author Li Zhong Wei
 */
public class SelectSort {
    public static void main(String[] args) {
        // 创建一个数组,这个数组元素是乱序的
        int[] array = { 63, 4, 24, 1, 3, 15 };
        // 创建直接排序类的对象
        SelectSort sorter = new SelectSort();
        // 调用排序对象的方法将数组排序
        sorter.sort(array);
    }

    /**
     *直接选择排序法
     *
     * @param array
     *            要排序的数组
     */
    public void sort(int[] array) {
        int index;
        for (int i = 1; i < array.length; i++) {
            index = 0;
            for (int j = 1; j <= array.length - i; j++) {
                if (array[j] > array[index]) {
                    index = j;
                }
            }
            // 交换在位置array.length-i和index(最大值)两个数
            int temp = array[array.length - i];// 把第一个元素值保持到临时变量中
            array[array.length - i] = array[index];// 把第二个元素值保存到第一个元素单元中
            array[index] = temp;// 把临时变量也就是第一个元素原值保持到第二个元素中
        }
        showArray(array);// 输出直接选择排序后的数组值
    }

    /**
     * 显示数组所有元素
     *
     * @param array
     *            要显示的数组
     */
    public void showArray(int[] array) {
        for (int i : array) {// foreach格式遍历数组
            System.out.print(" >" + i);// 输出每个数组元素值
        }
        System.out.println();
    }
}



//输出结果为
选择排序的结果为:
 >1 >3 >4 >15 >24 >63

修改如下,即可实现降序

    if (array[j] < array[index]) {
        index = j;
    }
}

//输出结果
 >63 >24 >15 >4 >3 >1

反转排序

实现思路:把数组的最后一个元素和第一个元素替换,倒数第二个元素和第二个元素替换, 依次类推,直到把所有数组元素反转替换。

算法示例:反转排序是对数组两边的元素进行替换,只需要循环数组长度的半数次。如果数组长度为7,
那么for循环只需要循环3次。

eg

 import java.util.Arrays;

public class ReverseSort {
//  主方法
    public static void main(String[] args) {
//      创建一个数组
        int[] array = { 10, 20, 30, 40, 50, 60 };

//      创建反转排序类的对象
        ReverseSort sorter = new ReverseSort();
//      调用排序对象的方法将数组反转
        sorter.sort(array);

    }

    /*
     * 反转排序
     *
     * @param array 要排序的数组
     */
    private void sort(int[] array) {
        System.out.println("数组原有内容 :");
        showArray(array); // 输出排序前数组值
        int temp;
        int len = array.length; // 获取数组的长度
        for (int i = 0; i < len / 2; i++) {
            // 只循环数组长度的半数次
            temp = array[i]; // 数组的值
            // 进行数值对调
            array[i] = array[len - 1 - i];
            array[len - 1 - i] = temp;
        }
        System.out.println("\n数组反转后内容: ");
        showArray(array); // 输出排序后的数组值
    }

    /*
     * 显示数组中的索引元素
     *
     * @param array 要显示的数组
     */
    public void showArray(int[] array) {
        for (int temp : array) {
//          遍历数组
            System.out.print("\t" + temp); // 输出每个元素的值

        }
    }

}

 //输出内容
 数组原有内容 :
    10  20  30  40  50  60
数组反转后内容:
    60  50  40  30  20  10

4.3.7. 课后练习

1.编写Java程序,创建数组arr1和arr2,将数组arr1中索引位置是0~3的元素赋值到数组arr2中,最后将 数组str1和str2的元素输出。

import java.util.Arrays;

public class array_test1 {
    public static void main(String[] args) {
//      定义数组arr1
        int[] arr1= {1,2,3,4,5,6};

//      定义数组arr2
        int [] arr2=Arrays.copyOfRange(arr1, 0, 3);
        System.out.println("arr1数组的值为:            ");

        for (int i = 0; i < arr1.length; i++) {
            System.out.print( arr1[i]);
        }
        System.out.println();
        System.out.println("arr2数组的值为:            ");
        for (int i = 0; i < arr2.length; i++) {
            System.out.print( arr2[i]);
        }


    }

}

//输出结果
/*
arr1数组的值为:
123456
arr2数组的值为:
123
 */

2.编写Java程序,将数组中最小的数输出

import java.util.Arrays;

public class array_test2 {
public static void main(String[] args) {
    int[] array= {6,5,4,3,7,8,1};
    System.out.println("数组的内容是:");
    for (int i = 0; i < array.length; i++) {
        System.out.print(array[i]);
    }

    System.out.println();
    Arrays.sort(array);
    System.out.println("数组中的最小值为:"+array[0]);
}
}


/*
数组的内容是:
6543781
数组中的最小值为:1
 */

3.编写Java程序,实现将数组arr中索引位置是2的元素替换为“bb”,并将替换前数组中的元素和替换后的 数组中的元素全部输出。

import java.util.Arrays;

public class array_test3 {
    public static void main(String[] args) {
//  定义数组arr
        int arr[] = { 1, 4, 5, 6, 7, 8, 9, 10 };

        System.out.println("arr 数组的值为: ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

        Arrays.fill(arr, 2, 3, 0);
        System.out.println();
        System.out.println("将索引位置是2的数替换为‘bb’后的输出: ");
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 0) {
                System.out.print("bb" + " ");
            } else {
                System.out.print(arr[i] + " ");
            }
        }

    }
}

/*
arr 数组的值为:
1 4 5 6 7 8 9 10
将索引位置是2的数替换为‘bb’后的输出:
1 4 bb 6 7 8 9 10
*/



import java.util.*;

public class Text { // 创建类
    public static void main(String[] args) {
        String arr[] = new String[] { "ac", "bc", "dc", "yc" };
        System.out.println("替换前:");
        for (String str : arr) {
            System.out.print(str+"\t");
        }
        Arrays.fill(arr, 2, 3, "bb");
        System.out.println("\n替换后:");
        for (String str2 : arr) {
            System.out.print(str2+"\t");
        }
    }
}

4.创建一个二维数组,进行转换展示的数组信息

public class array2_show { // 创建类
    public static void main(String[] args) {
        int arr[][]=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
        System.out.println("数组原有内容:");
        for(int i = 0;i<arr.length;i++){
            for(int j=0;j<arr.length;j++){
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println("行列互换后数组内容:");
        for(int i = 0;i<arr.length;i++){
            for(int j=0;j<arr.length;j++){
                System.out.print(arr[j][i] + " ");
            }
            System.out.println();
        }
    }
}

/*
 数组原有内容:
1 2 3
4 5 6
7 8 9
行列互换后数组内容:
1 4 7
2 5 8
3 6 9

 */