Java Arrays Methods - Java 147

Java Arrays Methods – Java 147

Java 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 常見方法的操作範例,實現操作基本型別陣列及物件陣列簡便的方法。

發佈留言