Java基础--Arrays类多个常见方法

Java中Arrays的常用方法

Arrays类位于java.untils包中

import java.util.Arrays

主要包含了操作数组的各种方法,提供了二分搜索、排序、复制、比较、填充,输出数组内容、截取数组等静态方法

二分查找:

首先我们来查看一下源码:下面这段代码截取于源码

public static int binarySearch(long[] a, long key) {
        return binarySearch0(a, 0, a.length, key);//
    }
//这段代码只能查找不存在目标不存在重复的有序数组,例如下列数组查找4,返回的是7,第一次出现4的下标为6
//int [] nums={1,1,2,2,3,3,4,4,4,4,4,4,5,5,6};
private static int binarySearch0(long[] a, int fromIndex, int toIndex, long key) {
        int low = fromIndex;
        int high = toIndex - 1;

        while (low <= high) {
            int mid = (low + high) >>> 1;//无符号右移一位,相当于除以2,为什么不写成low+((high-low)>>>1),上面那种写法不怕溢出?
            long midVal = a[mid];

            if (midVal < key)
                low = mid + 1;
            else if (midVal > key)
                high = mid - 1;
            else//当找到符合的目标
                return mid; // key found,返回目标下标
        }
        return -(low + 1);  // key not found.
    }

在这里重写一下上面的函数,当存在多个目标数字,返回其左右端点

//寻找左端点
private static int binarySearchLeftBound(long[] a, int fromIndex, int toIndex, long key) {
        int low = fromIndex;
        int high = toIndex - 1;

        while (low <= high) {
            int mid = low+(high-low)/2;
            long midVal = a[mid];
			if(midVal==key){
				//不断向左端点逼近
				high=mid-1;
			}
			else if(key<midVal){
                high=mid-1;
            }
            else if(key>midVal){
                low=mid+1;
            }
        }
        //检查是否越界和数组是否存在该数
        if(left>=nums.length || nums[left]!=key)
        	return -1;
        return low;
    }
//寻找右端点
private static int binarySearchLeftBound(long[] a, int fromIndex, int toIndex, long key) {
        int low = fromIndex;
        int high = toIndex - 1;

        while (low <= high) {
            int mid = low+(high-low)/2;
            long midVal = a[mid];
			if(midval==key){
				//不断向左端点逼近
				low=mid+1;
			}
			else if(key<midVal){
                high=mid-1;
            }
            else if(key>midVal){
                low=mid+1;
            }
        }
        //检查数组是否越界和是否存在该数
        if(right<0 || nums[left]!=key)
        	return -1;
        return right;
    }

排序:默认按升序排列

大部分编译器关于底层排序几乎都是快速排序,在这里我们复习一波快速排序

1、操作数列中所有的数字,在所有数字中选择一个数字作为排序的基准(pivot),pivot通常是随机选择的
2、选择好pivot后,在操作数列中选择最左边的数字标记为左标记,最右边的数字标记为右标记
3、将左边的标记向右移动
4、当左标记到达超过privot的数字时,停止移动
5然后将右边的标记向左移动
6、当右标记到达小于privot的数字,停止移动
7、当左右标记停止,更改标记的数字
8、左标记的作用是找到一个大于pivot的数字,右标记的作用是找到一个小于pivot的数字
9、通过交换数字,可以在数列的左边收集到小于pivot的数字集合,最右边收集大于pivot的数字集合
10、交换以后,继续移动左标记
11、然后将右标记向左移动
12、当右标记碰到左标记时也停止移动
13、当左右侧的标记都停止时,并且都在同一个位置,将这个数字和pivot交换
14、这就完成了第一次操作
15、随后递归这分成的两部分执行相同的操作
16、完成快速排序

//快速排序
public class QuickSort(){
	public int[] sort(int[] sourceArray){
		int[] arr=Arrays.copyOf(sourceArray,sourceArray.length);
		return quickSort(arr,0,arr.length-1);
	}
	private int[] quickSort(int[] arr,int left,int right){
		if(left<right){
			int partitionIndex=partition(arr,int left,int right);
			quickSort(arr,left,paritionIndex-1);
			quickSort(arr,partitionIndex+1,right);
		}
		return arr;
	}
	private int partition(int[] arr,int left,int right){
	//设定基准值
	int pivot=left;
	int index=pivot+1;
	for(int i=index;i<=right;++i){
		if(arr[i]<arr[pivot]){
			swap(arr,i,index);
			++index;
		}
	}
		swap(arr,pivot,index-1);
		return index-1;
	}
	private void swap(int[] arr,int i,int j){
		int temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;
	}
}
//使用sort完成排序
public class TempTest {
    public static void main(String[] args) {
        int[] arr={1,23,5,4,6,8,9,10,45};
        System.out.println("排序前: ");
        System.out.println(Arrays.toString(arr));

        System.out.println("排序后: ");
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
		//指定范围排序,下方的输出没有输出这行的结果,了解即可
		Arrays.sort(arr,0,3);//给第0位(0开始)到第3位(不包括)排序
    }
}

//那么如何降序输出呢
//方式1
//使用Collections.reverseOrder(),我还没学到这个,百度意思就可以输出一个反向
Arrays.sort(arr,Collections.reverseOrder());

//方式2:
//将int行数组转成对应的包装类Integer数组,再自定义一个比较器即可
Integer[] arr1=new Integer[arr.length];
Comparator<Integer> cmp=new Comparator<Integer>() {
	@Override
	public int compare(Integer o1, Integer o2) {
	return o2-o1;
	}
};
for (int i=0;i<arr.length;++i){
	arr1[i]=arr[i];
}
Arrays.sort(arr1,cmp);

在这里插入图片描述

复制

功能:拷贝生成一个新数组

public class TempTest {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int[] arrayCopy = Arrays.copyOf(array,8);  // 拷贝并生成一个新的数组对象,并设置长度为8
        System.out.println(Arrays.toString(arrayCopy));
		//范围拷贝
        int []arr1 = Arrays.copyOfRange(array,1,3);
        System.out.println(Arrays.toString(arr1));

    }
}

在这里插入图片描述

填充

功能:对数组中指定的索引范围进行填充,如果索引处有值,进行覆盖

public class TempTest {
    public static void main(String[] args) {
        int[] array = new int[5];
        Arrays.fill(array,0,3,9); // 给数组下标 0~2的元素填充9
        System.out.println(Arrays.toString(array));  // 输出[9, 9, 9, 0, 0]

        int [] array1={1,2,3,4,5};
        Arrays.fill(array1,0,3,9); // 给数组下标 0~2的元素填充9
        System.out.println(Arrays.toString(array1));  // 输出[9, 9, 9, 4, 5]
    }
}

比较

①Arrays.equals 比较一维数组
②Arrays.deepEquals 比较多维数组

public class TempTest {
    public static void main(String[] args) {
        int[] array1 = {1,2,3};
        int[] array2 = {1,2,3};
        int[] array3 = {1,2,4};
        System.out.println(Arrays.equals(array1,array2));  // 数组的比较,返回true
        System.out.println(Arrays.equals(array1,array3));  // 数组的比较,返回false
    }
}
public static void main(String[] args) {
        Integer[][] array1 = {{1,2,3}};
        Integer[][] array2 = {{1,2,3}};
        Integer[][] array3 = {{1,2,4}};
        System.out.println(Arrays.equals(array1,array2));  // 多维数组的比较,返回false
        System.out.println(Arrays.equals(array1,array3));  // 多维数组的比较,返回false
        System.out.println(Arrays.deepEquals(array1,array2));  // 多维数组深比较,判断是否是同一个对象,返回true
    }

输出数组内容

输出数组内容

Arrays.toString方法,比较简单

public static void main(String[] args) {
        int[] array = {3,2,1,4,5};
        System.out.println(array);  // 输出 [I@61bbe9ba
        System.out.println(Arrays.toString(array));  // 输出 [3, 2, 1, 4, 5]
    }

注:以上内容参考了一部分其他博客的内容,由于不小心点没了,没法提出引用,在此表示感谢。记录学习的每一天,加油!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值