Comparator in Java with Examples - Java 147

Comparator in Java with Examples – Java 147

Comparator in Java with Examples

只有一個抽象方法的接口,定義了 compare 方法,可以在一個元素上測試或應用一些操作,常用於集合或陣列比較元素,例如:從小到大或大到小排序,取代傳統實作接口的方法,讓程式碼更加簡潔和易讀, Comparator in Java 本篇增加了範例,並透過單元測試來驗證產出結果。

o1 大於 o2 傳回 1 。
o1 等於 o2 傳回 0 。
o1 小於 o2 傳回 -1 。

@FunctionalInterface
public interface Comparator<T> {
    int compare(T o1, T o2);
}    

檔案目錄

./
   +- src
       +- test
       |   +- org
       |       +- ruoxue
       |           +- java_147
       |               +- comparator
       |                   +- ComparatorWithExamplesTest.java  

單元測試

Comparator Java 提供 comparingInt 、 naturalOrder 條件或組合成鏈式判斷等操作 Comparator 。

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();
		}

		public boolean equals(Object object) {
			if (!(object instanceof Fruit)) {
				return false;
			}
			if (this == object) {
				return true;
			}
			Fruit other = (Fruit) object;
			return new EqualsBuilder().append(getName(), other.getName()).isEquals();
		}

		public int hashCode() {
			return new HashCodeBuilder().append(getName()).toHashCode();
		}
	}

comparingInt

Comparator Java 建立集合,比對元素,由小到大排序。

	@Test
	public void comparingInt() {
		List<Fruit> list = Arrays.asList(new Fruit("Mango", 1.2, 2), new Fruit("Peach", 1.1, 3),
				new Fruit("Orange", 2, 1));
		System.out.println(list);

		list.sort(Comparator.comparingInt(Fruit::getType));
		System.out.println(list);
		assertEquals("Orange", list.get(0).getName());
		assertEquals("Mango", list.get(1).getName());
		assertEquals("Peach", list.get(2).getName());
	}
[{"name":"Mango","quantity":1.2,"type":2}, {"name":"Peach","quantity":1.1,"type":3}, {"name":"Orange","quantity":2.0,"type":1}]
[{"name":"Orange","quantity":2.0,"type":1}, {"name":"Mango","quantity":1.2,"type":2}, {"name":"Peach","quantity":1.1,"type":3}]

comparingLong

Comparator Java 建立集合,比對元素,由小到大排序。

	@Test
	public void comparingLong() {
		List<Long> list = Arrays.asList(3L, 1L, 5L, 9L, 7L);
		System.out.println(list);

		list.sort(Comparator.comparingLong(e -> e));
		System.out.println(list);
		assertEquals(1L, list.get(0).longValue());
		assertEquals(3L, list.get(1).longValue());
		assertEquals(5L, list.get(2).longValue());
	}
[3, 1, 5, 9, 7]
[1, 3, 5, 7, 9]

comparingDouble

Comparator Java 建立集合,比對元素,由小到大排序。

	@Test
	public void comparingDouble() {
		List<Fruit> list = Arrays.asList(new Fruit("Mango", 1.2, 2), new Fruit("Peach", 1.1, 3),
				new Fruit("Orange", 2, 1));
		System.out.println(list);

		list.sort(Comparator.comparingDouble(Fruit::getQuantity));
		System.out.println(list);
		assertEquals("Peach", list.get(0).getName());
		assertEquals("Mango", list.get(1).getName());
		assertEquals("Orange", list.get(2).getName());
	}
[{"name":"Mango","quantity":1.2,"type":2}, {"name":"Peach","quantity":1.1,"type":3}, {"name":"Orange","quantity":2.0,"type":1}]
[{"name":"Peach","quantity":1.1,"type":3}, {"name":"Mango","quantity":1.2,"type":2}, {"name":"Orange","quantity":2.0,"type":1}]

naturalOrder

Java Comparator 建立集合,比對元素,由小到大排序。

	@Test
	public void naturalOrder() {
		List<String> list = Arrays.asList("Mango", "Peach", "Orange");
		System.out.println(list);

		list.sort(Comparator.naturalOrder());
		System.out.println(list);
		assertEquals("Mango", list.get(0));
		assertEquals("Orange", list.get(1));
		assertEquals("Peach", list.get(2));
	}
[Mango, Peach, Orange]
[Mango, Orange, Peach]

reverseOrder

Java Comparator 建立集合,比對元素,由大到小排序。

	@Test
	public void reverseOrder() {
		List<String> list = Arrays.asList("Mango", "Peach", "Orange");
		System.out.println(list);

		list.sort(Comparator.reverseOrder());
		System.out.println(list);
		assertEquals("Peach", list.get(0));
		assertEquals("Orange", list.get(1));
		assertEquals("Mango", list.get(2));
	}
[Mango, Peach, Orange]
[Peach, Orange, Mango]

ComparatorWithExamplesTest.java

Java Comparator 新增單元測試,驗證 Java Comparator Example 是否符合預期。

package org.ruoxue.java_147.comparator;

import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
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 ComparatorWithExamplesTest {

	@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();
		}

		public boolean equals(Object object) {
			if (!(object instanceof Fruit)) {
				return false;
			}
			if (this == object) {
				return true;
			}
			Fruit other = (Fruit) object;
			return new EqualsBuilder().append(getName(), other.getName()).isEquals();
		}

		public int hashCode() {
			return new HashCodeBuilder().append(getName()).toHashCode();
		}
	}

	@Test
	public void comparingInt() {
		List<Fruit> list = Arrays.asList(new Fruit("Mango", 1.2, 2), new Fruit("Peach", 1.1, 3),
				new Fruit("Orange", 2, 1));
		System.out.println(list);

		list.sort(Comparator.comparingInt(Fruit::getType));
		System.out.println(list);
		assertEquals("Orange", list.get(0).getName());
		assertEquals("Mango", list.get(1).getName());
		assertEquals("Peach", list.get(2).getName());
	}

	@Test
	public void comparingLong() {
		List<Long> list = Arrays.asList(3L, 1L, 5L, 9L, 7L);
		System.out.println(list);

		list.sort(Comparator.comparingLong(e -> e));
		System.out.println(list);
		assertEquals(1L, list.get(0).longValue());
		assertEquals(3L, list.get(1).longValue());
		assertEquals(5L, list.get(2).longValue());
	}

	@Test
	public void comparingDouble() {
		List<Fruit> list = Arrays.asList(new Fruit("Mango", 1.2, 2), new Fruit("Peach", 1.1, 3),
				new Fruit("Orange", 2, 1));
		System.out.println(list);

		list.sort(Comparator.comparingDouble(Fruit::getQuantity));
		System.out.println(list);
		assertEquals("Peach", list.get(0).getName());
		assertEquals("Mango", list.get(1).getName());
		assertEquals("Orange", list.get(2).getName());
	}

	@Test
	public void naturalOrder() {
		List<String> list = Arrays.asList("Mango", "Peach", "Orange");
		System.out.println(list);

		list.sort(Comparator.naturalOrder());
		System.out.println(list);
		assertEquals("Mango", list.get(0));
		assertEquals("Orange", list.get(1));
		assertEquals("Peach", list.get(2));
	}

	@Test
	public void reverseOrder() {
		List<String> list = Arrays.asList("Mango", "Peach", "Orange");
		System.out.println(list);

		list.sort(Comparator.reverseOrder());
		System.out.println(list);
		assertEquals("Peach", list.get(0));
		assertEquals("Orange", list.get(1));
		assertEquals("Mango", list.get(2));
	}
}

心得分享

Java Comparator Example 功能接口,使用 Lambda 語法,可當作其他方法的傳入參數或是引用其他方法為實例, Java Comparator 提供了幾種 Comparator 常見方法的操作範例,例如: comparingInt 、 naturalOrder 等方法。

發佈留言