Table of Contents
ToggleJava Arrays Methods
集合框架的一部分,由靜態方法和物件類的方法組成,介紹常見的 asList 、 binarySearch 、 copyOf 、 parallelSort 等方法,Java Util Arrays 支援陣列操作,提供建立、比較、排序、搜索、流式傳輸和轉換陣列,本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- array
| +- ArraysMethodsTest.java
單元測試
Arrays Class Java 集合類別工具,提供轉換、搜索、複製、排序等操作陣列中的元素。
Fruit
建立 Fruit 類別,覆寫 equals 、 hashCode ,定義屬性和方法,用來建立一個物件。
@NoArgsConstructor
@Getter
@Setter
@Builder
public static class Fruit {
private String name;
private double quantity;
private int type;
public Fruit(String name, double quantity, int type) {
this.name = name;
this.quantity = quantity;
this.type = type;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
builder.appendSuper(super.toString());
builder.append("name", name);
builder.append("quantity", quantity);
builder.append("type", type);
return builder.toString();
}
}
asList
Arrays Class Java 建立一個 Array 轉換成 List ,內有三個元素。
@Test
public void asList() {
int expectedSize = 3;
String[] array = new String[] { "Durian", "Guava", "Pitaya" };
List<String> list = Arrays.asList(array);
System.out.println(list);
assertThat(list).hasSize(expectedSize);
Integer[] intArray = new Integer[] { Integer.MAX_VALUE, -1, 3 };
List<Integer> intList = Arrays.asList(intArray);
System.out.println(intList);
assertThat(list).hasSize(expectedSize);
}
[Durian, Guava, Pitaya]
[2147483647, -1, 3]
binarySearch
Arrays Class Java 建立一個 Array ,內有三個元素,搜尋特定元素,傳回 index。
@Test
public void binarySearch() {
int expectedIndex = 1;
String[] array = new String[] { "Durian", "Guava", "Pitaya" };
int result = Arrays.binarySearch(array, "Guava");
System.out.println(result);
assertThat(result).isEqualTo(expectedIndex);
int[] intArray = new int[] { Integer.MAX_VALUE, -1, 3 };
int intResult = Arrays.binarySearch(intArray, -1);
System.out.println(intResult);
assertThat(intResult).isEqualTo(expectedIndex);
}
1
1
copyOf
Arrays Class Java 建立一個 Array ,內有三個元素,複製另一個 Array。
@Test
public void copyOf() {
int expectedSize = 5;
String[] array = new String[] { "Durian", "Guava", "Pitaya" };
System.out.println(Arrays.toString(array));
String[] array2 = null;
array2 = Arrays.copyOf(array, 5);
System.out.println(Arrays.toString(array2));
assertThat(array2).hasSize(expectedSize);
int[] intArray = new int[] { Integer.MAX_VALUE, -1, 3 };
System.out.println(Arrays.toString(intArray));
int[] intArray2 = null;
intArray2 = Arrays.copyOf(intArray, 5);
System.out.println(Arrays.toString(intArray2));
assertThat(intArray2).hasSize(expectedSize);
}
[Durian, Guava, Pitaya]
[Durian, Guava, Pitaya, null, null]
[2147483647, -1, 3]
[2147483647, -1, 3, 0, 0]
copyOfRange
Arrays Class Java 建立一個 Array ,內有三個元素,指定範圍,複製另一個 Array。
@Test
public void copyOfRange() {
int expectedSize = 1;
String[] array = new String[] { "Durian", "Guava", "Pitaya" };
System.out.println(Arrays.toString(array));
String[] array2 = null;
array2 = Arrays.copyOfRange(array, 1, 2);
System.out.println(Arrays.toString(array2));
assertThat(array2).hasSize(expectedSize);
int[] intArray = new int[] { Integer.MAX_VALUE, -1, 3 };
System.out.println(Arrays.toString(intArray));
int[] intArray2 = null;
intArray2 = Arrays.copyOfRange(intArray, 1, 2);
System.out.println(Arrays.toString(intArray2));
assertThat(intArray2).hasSize(expectedSize);
}
[Durian, Guava, Pitaya]
[Guava]
[2147483647, -1, 3]
[-1]
parallelSort
Arrays in Java 建立一個 Array ,內有三個元素,並行排序元素。
@Test
public void parallelSort() {
int size = 1_000_000;
String[] array = new String[size];
for (int i = 0; i < size; i++) {
array[i] = UUID.randomUUID().toString();
}
long beg = System.currentTimeMillis();
Arrays.parallelSort(array);
long end = System.currentTimeMillis();
// parallelSort waste: 374 mills.
System.out.println("parallelSort waste: " + (end - beg) + " mills.");
beg = System.currentTimeMillis();
Arrays.sort(array);
end = System.currentTimeMillis();
// sort waste: 34 mills.
System.out.println("sort waste: " + (end - beg) + " mills.");
}
parallelSort waste: 942 mills.
sort waste: 205 mills.
parallelSortWithComparator
Arrays in Java 建立一個 Array ,內有三個元素,使用 Comparator 自定義比較器,並行排序元素。
protected static Comparator<Fruit> quantityComparator = new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
return Double.compare(o1.quantity, o2.quantity);
}
};
@Test
public void parallelSortWithComparator() {
Fruit durian = new Fruit("Durian", 1, 1);
Fruit pitaya = new Fruit("Pitaya", 3, 1);
Fruit guava = new Fruit("Guava", 2, 1);
Fruit[] array = new Fruit[] { durian, pitaya, guava };
System.out.println(Arrays.toString(array));
Arrays.parallelSort(array, quantityComparator);
System.out.println(Arrays.toString(array));
assertThat(array).containsExactly(durian, guava, pitaya);
}
[{"name":"Durian","quantity":1.0,"type":1}, {"name":"Pitaya","quantity":3.0,"type":1}, {"name":"Guava","quantity":2.0,"type":1}]
[{"name":"Durian","quantity":1.0,"type":1}, {"name":"Guava","quantity":2.0,"type":1}, {"name":"Pitaya","quantity":3.0,"type":1}]
parallelSortWithLambda
Arrays in Java 建立一個 Array ,內有三個元素,使用 Lambda 自定義比較器,並行排序元素。
@Test
public void parallelSortWithLambda() {
Fruit durian = new Fruit("Durian", 1, 1);
Fruit pitaya = new Fruit("Pitaya", 3, 1);
Fruit guava = new Fruit("Guava", 2, 1);
Fruit[] array = new Fruit[] { durian, pitaya, guava };
System.out.println(Arrays.toString(array));
Arrays.parallelSort(array, (o1, o2) -> Double.compare(o1.quantity, o2.quantity));
System.out.println(Arrays.toString(array));
assertThat(array).containsExactly(durian, guava, pitaya);
}
[{"name":"Durian","quantity":1.0,"type":1}, {"name":"Pitaya","quantity":3.0,"type":1}, {"name":"Guava","quantity":2.0,"type":1}]
[{"name":"Durian","quantity":1.0,"type":1}, {"name":"Guava","quantity":2.0,"type":1}, {"name":"Pitaya","quantity":3.0,"type":1}]
ArraysMethodsTest.java
Arrays in Java 新增單元測試,驗證是否符合預期。
package org.ruoxue.java_147.array;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.UUID;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.junit.Test;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
public class ArraysMethodsTest {
@NoArgsConstructor
@Getter
@Setter
@Builder
public static class Fruit {
private String name;
private double quantity;
private int type;
public Fruit(String name, double quantity, int type) {
this.name = name;
this.quantity = quantity;
this.type = type;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
builder.appendSuper(super.toString());
builder.append("name", name);
builder.append("quantity", quantity);
builder.append("type", type);
return builder.toString();
}
}
@Test
public void asList() {
int expectedSize = 3;
String[] array = new String[] { "Durian", "Guava", "Pitaya" };
List<String> list = Arrays.asList(array);
System.out.println(list);
assertThat(list).hasSize(expectedSize);
Integer[] intArray = new Integer[] { Integer.MAX_VALUE, -1, 3 };
List<Integer> intList = Arrays.asList(intArray);
System.out.println(intList);
assertThat(list).hasSize(expectedSize);
}
@Test
public void binarySearch() {
int expectedIndex = 1;
String[] array = new String[] { "Durian", "Guava", "Pitaya" };
int result = Arrays.binarySearch(array, "Guava");
System.out.println(result);
assertThat(result).isEqualTo(expectedIndex);
int[] intArray = new int[] { Integer.MAX_VALUE, -1, 3 };
int intResult = Arrays.binarySearch(intArray, -1);
System.out.println(intResult);
assertThat(intResult).isEqualTo(expectedIndex);
}
@Test
public void copyOf() {
int expectedSize = 5;
String[] array = new String[] { "Durian", "Guava", "Pitaya" };
System.out.println(Arrays.toString(array));
String[] array2 = null;
array2 = Arrays.copyOf(array, 5);
System.out.println(Arrays.toString(array2));
assertThat(array2).hasSize(expectedSize);
int[] intArray = new int[] { Integer.MAX_VALUE, -1, 3 };
System.out.println(Arrays.toString(intArray));
int[] intArray2 = null;
intArray2 = Arrays.copyOf(intArray, 5);
System.out.println(Arrays.toString(intArray2));
assertThat(intArray2).hasSize(expectedSize);
}
@Test
public void copyOfRange() {
int expectedSize = 1;
String[] array = new String[] { "Durian", "Guava", "Pitaya" };
System.out.println(Arrays.toString(array));
String[] array2 = null;
array2 = Arrays.copyOfRange(array, 1, 2);
System.out.println(Arrays.toString(array2));
assertThat(array2).hasSize(expectedSize);
int[] intArray = new int[] { Integer.MAX_VALUE, -1, 3 };
System.out.println(Arrays.toString(intArray));
int[] intArray2 = null;
intArray2 = Arrays.copyOfRange(intArray, 1, 2);
System.out.println(Arrays.toString(intArray2));
assertThat(intArray2).hasSize(expectedSize);
}
@Test
public void parallelSort() {
int size = 1_000_000;
String[] array = new String[size];
for (int i = 0; i < size; i++) {
array[i] = UUID.randomUUID().toString();
}
long beg = System.currentTimeMillis();
Arrays.parallelSort(array);
long end = System.currentTimeMillis();
// parallelSort waste: 374 mills.
System.out.println("parallelSort waste: " + (end - beg) + " mills.");
beg = System.currentTimeMillis();
Arrays.sort(array);
end = System.currentTimeMillis();
// sort waste: 34 mills.
System.out.println("sort waste: " + (end - beg) + " mills.");
}
protected static Comparator<Fruit> quantityComparator = new Comparator<Fruit>() {
@Override
public int compare(Fruit o1, Fruit o2) {
return Double.compare(o1.quantity, o2.quantity);
}
};
@Test
public void parallelSortWithComparator() {
Fruit durian = new Fruit("Durian", 1, 1);
Fruit pitaya = new Fruit("Pitaya", 3, 1);
Fruit guava = new Fruit("Guava", 2, 1);
Fruit[] array = new Fruit[] { durian, pitaya, guava };
System.out.println(Arrays.toString(array));
Arrays.parallelSort(array, quantityComparator);
System.out.println(Arrays.toString(array));
assertThat(array).containsExactly(durian, guava, pitaya);
}
@Test
public void parallelSortWithLambda() {
Fruit durian = new Fruit("Durian", 1, 1);
Fruit pitaya = new Fruit("Pitaya", 3, 1);
Fruit guava = new Fruit("Guava", 2, 1);
Fruit[] array = new Fruit[] { durian, pitaya, guava };
System.out.println(Arrays.toString(array));
Arrays.parallelSort(array, (o1, o2) -> Double.compare(o1.quantity, o2.quantity));
System.out.println(Arrays.toString(array));
assertThat(array).containsExactly(durian, guava, pitaya);
}
}
心得分享
Arrays Methods Java 支援陣列操作,建立、比較、排序、搜索、流式傳輸和轉換陣列 , Arrays in Java 提供了幾種 Arrays 常見方法的操作範例,實現操作基本型別陣列及物件陣列簡便的方法。