• Java数组(4):数组实用功能


    Java标准类库的System.arraycopy()方法,及在java.utils.Arrays类中一套用于数组的static方法,都是操纵数组实用功能。下面分别介绍。

    (1) 数组的复制

    (2) 数组的比较

    (3) 数组的排序和查找

    (1) 数组的复制

    System.arraycopy(源数组, 从源数组的什么位置开始复制的偏移量, 目标数组, 从标数数组的什么位置开始复制的偏移量, 需要复制的元素的个数)

    System.arraycopy已经对所有基本类型(包装类型同样适用)做了重载,如果复制对象,则只是浅复制(复制引用)。

    下面以int作为示例:

     1 import java.util.Arrays;
     2 
     3 public class Test1 {
     4     public static void main(String[] args) {
     5         int[] i = new int[3];
     6         int[] j = new int[7];
     7         Arrays.fill(i, 47);
     8         Arrays.fill(j, 99);
     9         System.out.println("i = " + Arrays.toString(i)); // i = [47, 47, 47]
    10         System.out.println("j = " + Arrays.toString(j)); // j = [99, 99, 99, 99, 99, 99, 99]
    11         int[] k = new int[5];
    12         Arrays.fill(k, 103);
    13         System.arraycopy(i, 0, k, 0, i.length);
    14         System.out.println("k = " + Arrays.toString(k)); // k = [47, 47, 47, 103, 103]
    15         System.arraycopy(k, 1, j, 0, 4); //
    16         System.out.println("j = " + Arrays.toString(j)); // j = [47, 47, 103, 103, 99, 99, 99]
    17     }
    18 }

    (2) 数组的比较

    同样,Arrays.equals已经对所有基本类型(包装类型同样适用)做了重载,对于对象比较,使用了对象的equals方法,所以必须重写对象的equals方法

     1 import java.util.Arrays;
     2 
     3 public class Test2 {
     4     public static void main(String[] args) {
     5         int[] a1 = new int[5];
     6         int[] a2 = new int[5];
     7         Arrays.fill(a1, 47);
     8         Arrays.fill(a2, 47);
     9         System.out.println(Arrays.equals(a1, a2)); // true
    10         a2[3] = 11;
    11         System.out.println(Arrays.equals(a1, a2)); // false
    12         String[] s1 = new String[4];
    13         Arrays.fill(s1, "Hi");
    14         String[] s2 = { "Hi", "Hi", new String("Hi"), new String("Hi") };
    15         System.out.println(Arrays.equals(s1, s2)); // true
    16     }
    17 }

    (3) 数组的排序和查找

    同样,Arrays.sort已经对所有基本类型(包装类型同样适用)做了重载,对于对象比较,必须实现Comparable接口。

    如果数组已经排好序,就可以使用Arrays.binarySearch执行快速查找(前提必须是排好序的数组)。

    如果使用了Comparator<T>排序了某个对象数组,使用Arrays.binarySearch时必须提供同样的Comparator<T>。

     1 import java.util.Arrays;
     2 import java.util.Collections;
     3 import java.util.Random;
     4 
     5 class CompType implements Comparable<CompType> {
     6     int i;
     7     int j;
     8 
     9     public CompType(int n1, int n2) {
    10         i = n1;
    11         j = n2;
    12     }
    13 
    14     @Override
    15     public String toString() {
    16         return "(" + i + ", " + j + ")";
    17     }
    18 
    19     @Override
    20     public int compareTo(CompType ct) {
    21         return i == ct.i ? Integer.compare(j, ct.j) : Integer.compare(i, ct.i);
    22     }
    23 }
    24 
    25 public class Test3 {
    26     public static void main(String[] args) {
    27 
    28         // 基本类型
    29         Random random = new Random(47);
    30         int[] a = random.ints(5, 5, 10).toArray();
    31         System.out.println(Arrays.toString(a)); // [8, 5, 8, 6, 6]
    32         Arrays.sort(a); // Arrays.sort(基本类型)
    33         System.out.println(Arrays.toString(a)); // [5, 6, 6, 8, 8]
    34 
    35         // 包装类型
    36         Integer[] b = { 3, 5, 9, 8, 2 };
    37         Arrays.sort(b); // Arrays.sort(Object)
    38         System.out.println(Arrays.toString(b)); // [2, 3, 5, 8, 9]
    39         Arrays.sort(b, Collections.reverseOrder()); // Arrays.sort(Object, Comparator<T>)
    40         System.out.println(Arrays.toString(b)); // [9, 8, 5, 3, 2]
    41 
    42         // String
    43         String[] c = { "A", "B", "AB", "AC", "a", "b", "ab", "ac" };
    44         Arrays.sort(c); // 字符串默认是字典排序[A-Za-z]
    45         System.out.println(Arrays.toString(c)); // [A, AB, AC, B, a, ab, ac, b]
    46         Arrays.sort(c, String.CASE_INSENSITIVE_ORDER); // 忽略大小写排序
    47         System.out.println(Arrays.toString(c)); // [A, a, AB, ab, AC, ac, B, b]
    48 
    49         // 对象类型
    50         CompType[] d = { new CompType(2, 2), new CompType(1, 2), new CompType(2, 4), new CompType(0, 3),
    51                 new CompType(3, 4), new CompType(3, 0), new CompType(2, 2), new CompType(2, 1) };
    52         Arrays.sort(d);
    53         System.out.println(Arrays.toString(d)); // [(0, 3), (1, 2), (2, 1), (2, 2), (2, 2), (2, 4), (3, 0), (3, 4)]
    54         Arrays.sort(d, Collections.reverseOrder());
    55         System.out.println(Arrays.toString(d)); // [(3, 4), (3, 0), (2, 4), (2, 2), (2, 2), (2, 1), (1, 2), (0, 3)]
    56 
    57         // 快速查找
    58         Arrays.sort(b);
    59         int location = Arrays.binarySearch(b, 8);
    60         System.out.println("Location of [5] is " + location + ", b[" + location + "] = " + b[location]); // Location of [5] is 3, b[3] = 8
    61 
    62         Arrays.sort(c);
    63         location = Arrays.binarySearch(c, "AC");
    64         System.out.println("Location of [AC] is " + location + ", c[" + location + "] = " + c[location]); // Location of [AC] is 2, c[2] = AC
    65 
    66         Arrays.sort(c, String.CASE_INSENSITIVE_ORDER);
    67         location = Arrays.binarySearch(c, "AC", String.CASE_INSENSITIVE_ORDER);
    68         System.out.println("Location of [AC] is " + location + ", c[" + location + "] = " + c[location]); // Location of [AC] is 5, c[5] = ac
    69 
    70         Arrays.sort(d);
    71         location = Arrays.binarySearch(d, new CompType(2, 4));
    72         System.out.println("Location of (2, 4) is " + location + ", d[" + location + "] = " + d[location]); // Location of (2, 4) is 5, d[5] = (2, 4)
    73     }
    74 }
  • 相关阅读:
    全方位讲解 Nebula Graph 索引原理和使用
    一首古诗带来的图数据库大冒险
    Nebula Graph 在众安保险的图实践
    springioc源码
    leetcode原地删除系列283移除0
    leetcode21单链表问题
    20天备考初级会计
    leetcode原地删除系列27
    leetcode 在排序数组中查找元素的第一个和最后一个位置
    内置后置处理器要理解的问题
  • 原文地址:https://www.cnblogs.com/storml/p/8399848.html
Copyright © 2020-2023  润新知