前言
利用java刷题的时候,数组是最常见,也是变化最多样的数据结构。在java中可以利用数组或者List列表来对数组元素进行处理,通常来说一维数组是数组中最多的。我们要学会一维和多维数组的处理方法,这样在刷题过程中才能更加的得心应手。
Arrays
在java中,如果没有特别说明不允许使用Arrays类,那么Arrays类就是一个大Bug,借助这个Bug,可以帮我们快速处理很多简单的算法题,排序、查找、复制等操作,都能通过Arrays来完成。
- JDK API:https://docs.oracle.com/javase/8/docs/api/index.html
Arrays类位于java.util.Arrays, 其中包含很多静态方法,可以直接调用。
- 官方描述:
此类包含用于操作数组的各种方法(例如排序和搜索)。此类还包含一个静态工厂,允许将数组视为列表。
如果指定的数组引用为null,则此类中的方法都会引发NullPointerException,除非另有说明。
此类中包含的方法的文档包括对实现的简要描述。此类描述应视为实施说明,而不是规范的一部分。只要遵守规范本身,实现者就可以随意替换其他算法。(例如,sort(Object[])使用的算法不必是MergeSort,但必须是稳定的。)
下面是常用方法:
//通过指定类型返回固定大小的List
static <T> List<T> asList(T... a)
//二分查找,返回下标
// 必须是排好序的数组,否则可能返回错误的值。
static int binarySearch(Object[] objArr, int from, int to, Object obj).
//以int为例
//拷贝数组,制定拷贝的长度
static int[] copyOf(int[] ar, int newLength)
//拷贝固定长度的数组
static int[] copyOfRange(int[] ar, int from, int to)
//常用的比较
//比较是否相等,若是多维,用deepEquals
static boolean equals(double[] a, double[] b)
//填充数组元素,以int为例,注意哪些方法是void
static void fill(int[] ar, int fromIndex, int toIndex, int val)
// IntBinaryOperator: (left, right)->((left+right) - left)
// 利用制定操作函数对当前元素进行操作,left是当前元素左边的元素,第一个元素左边为1,right为当前元素
static void parallelPrefix(int[] array, IntBinaryOperator op)
// 对每个元素做点什么
static void parallelSetAll(int[] ar, IntUnaryOperator generator)
static void setAll(int[] ar, IntUnaryOperator generator)
//并行排序
static void parallelSort(int[] ar, int fromIndex, int toIndex)
// 排序
static void sort(int[] ar, int fromIndex, int toIndex)
//返回数组的字符串形式
static String toString(int[] ar)
- 简单样例
import java.util.*;
public class TestArrays {
public static void main(String[] args){
Random random = new Random();
int len = random.nextInt(999);
int[] ar = new int[len];
// 生成随机数组
for(int i=0; i<len; i++){
ar[i] = random.nextInt(999);
}
// toString方法
System.out.println(Arrays.toString(ar));
// 排序
//Arrays.sort(ar);
Arrays.parallelSort(ar);
System.out.println(Arrays.toString(ar));
// 二分查找
int result = Arrays.binarySearch(ar, 100);
System.out.println(result);
// 利用lambda函数填充每个元素填充
Arrays.parallelPrefix(ar, (x, y)->(x+y));
// 遍历每一个元素
Arrays.parallelSetAll(ar, (x)->{return x*100 + 5;});
}
}
- 说明
主要需要掌握的是sort和search这两个,因为查找和排序是数组中常考的内容,掌握了那么排序和查找就很简单了。