Рубрики
Без рубрики

Пример сортировки объектов Java (Сопоставимый и компаратор)

– Пример сортировки объектов Java (Сопоставимый и компаратор)

В этом учебном пособии показано использование java.lang. Сопоставимый и java.util. Компаратор для сортировки объекта Java на основе значения его свойства.

1. Сортировка массива

Для сортировки массива используйте Arrays.sort () .

	String[] fruits = new String[] {"Pineapple","Apple", "Orange", "Banana"}; 
		
	Arrays.sort(fruits);
		
	int i=0;
	for(String temp: fruits){
		System.out.println("fruits " + ++i + " : " + temp);
	}

Выход

fruits 1 : Apple
fruits 2 : Banana
fruits 3 : Orange
fruits 4 : Pineapple

2. Сортировка списка массивов

Для сортировки списка массивов используйте Collections.sort() .

	List fruits = new ArrayList();
		 
	fruits.add("Pineapple");
	fruits.add("Apple");
	fruits.add("Orange");
	fruits.add("Banana");
	
	Collections.sort(fruits);
		
	int i=0;
	for(String temp: fruits){
		System.out.println("fruits " + ++i + " : " + temp);
	}

Выход

fruits 1 : Apple
fruits 2 : Banana
fruits 3 : Orange
fruits 4 : Pineapple

3. Сортировка объекта с сопоставимыми

Как насчет объекта Java? Позвольте создать класс фруктов:

public class Fruit{
	
	private String fruitName;
	private String fruitDesc;
	private int quantity;
	
	public Fruit(String fruitName, String fruitDesc, int quantity) {
		super();
		this.fruitName = fruitName;
		this.fruitDesc = fruitDesc;
		this.quantity = quantity;
	}
	
	public String getFruitName() {
		return fruitName;
	}
	public void setFruitName(String fruitName) {
		this.fruitName = fruitName;
	}
	public String getFruitDesc() {
		return fruitDesc;
	}
	public void setFruitDesc(String fruitDesc) {
		this.fruitDesc = fruitDesc;
	}
	public int getQuantity() {
		return quantity;
	}
	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}
}

Чтобы отсортировать его, вы можете подумать о Массивах.сортировать () опять же, смотрите пример ниже:

package com.mkyong.common.action;

import java.util.Arrays;

public class SortFruitObject{
	
	public static void main(String args[]){

		Fruit[] fruits = new Fruit[4];
		
		Fruit pineappale = new Fruit("Pineapple", "Pineapple description",70); 
		Fruit apple = new Fruit("Apple", "Apple description",100); 
		Fruit orange = new Fruit("Orange", "Orange description",80); 
		Fruit banana = new Fruit("Banana", "Banana description",90); 
		
		fruits[0]=pineappale;
		fruits[1]=apple;
		fruits[2]=orange;
		fruits[3]=banana;
		
		Arrays.sort(fruits);

		int i=0;
		for(Fruit temp: fruits){
		   System.out.println("fruits " + ++i + " : " + temp.getFruitName() + 
			", Quantity : " + temp.getQuantity());
		}
		
	}	
}

Хорошая попытка, но, что вы ожидаете от массивов.сортировать () подойдет? Вы даже не упомянули, что сортировать в классе фруктов. Таким образом, это приведет к следующей ошибке:

Exception in thread "main" java.lang.ClassCastException: 
com.mkyong.common.Fruit cannot be cast to java.lang.Comparable
	at java.util.Arrays.mergeSort(Unknown Source)
	at java.util.Arrays.sort(Unknown Source)

Чтобы отсортировать объект по его свойству, вы должны заставить объект реализовать интерфейс Comparable и переопределить метод compareTo() . Давайте еще раз посмотрим на новый класс фруктов.

public class Fruit implements Comparable{
	
	private String fruitName;
	private String fruitDesc;
	private int quantity;
	
	public Fruit(String fruitName, String fruitDesc, int quantity) {
		super();
		this.fruitName = fruitName;
		this.fruitDesc = fruitDesc;
		this.quantity = quantity;
	}
	
	public String getFruitName() {
		return fruitName;
	}
	public void setFruitName(String fruitName) {
		this.fruitName = fruitName;
	}
	public String getFruitDesc() {
		return fruitDesc;
	}
	public void setFruitDesc(String fruitDesc) {
		this.fruitDesc = fruitDesc;
	}
	public int getQuantity() {
		return quantity;
	}
	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

	public int compareTo(Fruit compareFruit) {
	
		int compareQuantity = ((Fruit) compareFruit).getQuantity(); 
		
		//ascending order
		return this.quantity - compareQuantity;
		
		//descending order
		//return compareQuantity - this.quantity;
		
	}	
}

Новый класс Fruit реализовал интерфейс Comparable и переопределил метод compareTo() для сравнения его свойства количества в порядке возрастания.

  1. этот.количество – сравнительное количество в порядке возрастания.
  2. Сравнительная величина – это.количество в порядке убывания.

Чтобы узнать больше о методе compareTo(), прочитайте эту Сопоставимую документацию .

Запустите его еще раз, теперь массив фруктов сортируется по количеству в порядке возрастания.

fruits 1 : Pineapple, Quantity : 70
fruits 2 : Orange, Quantity : 80
fruits 3 : Banana, Quantity : 90
fruits 4 : Apple, Quantity : 100

4. Сортировка объекта с помощью компаратора

Как насчет сортировки с помощью “Названия фруктов” или “Количества”? Сопоставимый интерфейс позволяет сортировать только одно свойство. Для сортировки с несколькими свойствами вам необходимо Компаратор . Снова посмотрите новый обновленный класс фруктов:

import java.util.Comparator;

public class Fruit implements Comparable{
	
	private String fruitName;
	private String fruitDesc;
	private int quantity;
	
	public Fruit(String fruitName, String fruitDesc, int quantity) {
		super();
		this.fruitName = fruitName;
		this.fruitDesc = fruitDesc;
		this.quantity = quantity;
	}
	
	public String getFruitName() {
		return fruitName;
	}
	public void setFruitName(String fruitName) {
		this.fruitName = fruitName;
	}
	public String getFruitDesc() {
		return fruitDesc;
	}
	public void setFruitDesc(String fruitDesc) {
		this.fruitDesc = fruitDesc;
	}
	public int getQuantity() {
		return quantity;
	}
	public void setQuantity(int quantity) {
		this.quantity = quantity;
	}

	public int compareTo(Fruit compareFruit) {
	
		int compareQuantity = ((Fruit) compareFruit).getQuantity(); 
		
		//ascending order
		return this.quantity - compareQuantity;
		
		//descending order
		//return compareQuantity - this.quantity;
		
	}
	
	public static Comparator FruitNameComparator 
                          = new Comparator() {

	    public int compare(Fruit fruit1, Fruit fruit2) {
	    	
	      String fruitName1 = fruit1.getFruitName().toUpperCase();
	      String fruitName2 = fruit2.getFruitName().toUpperCase();
	      
	      //ascending order
	      return fruitName1.compareTo(fruitName2);
	      
	      //descending order
	      //return fruitName2.compareTo(fruitName1);
	    }

	};
}

Класс Fruit содержит статический Компаратор имен фруктов метод сравнения “Имени плода”. Теперь объект Fruit может сортировать либо по свойству “количество”, либо по свойству “название плода”. Запустите его еще раз.

1. Сортируйте фруктовый массив по свойству “Название фрукта” в порядке возрастания.

Arrays.sort(fruits, Fruit.FruitNameComparator);

Выход

fruits 1 : Apple, Quantity : 100
fruits 2 : Banana, Quantity : 90
fruits 3 : Orange, Quantity : 80
fruits 4 : Pineapple, Quantity : 70

2. Сортируйте фруктовый массив по свойству “количество” в порядке возрастания.

Arrays.sort(fruits)

Выход

fruits 1 : Pineapple, Quantity : 70
fruits 2 : Orange, Quantity : 80
fruits 3 : Banana, Quantity : 90
fruits 4 : Apple, Quantity : 100

Мои мысли…

В будущем класс Arrays должен предоставлять более универсальный и удобный метод – Arrays.sort(Объект, строка, флаг) .

Для сортировки массива объектов по его “названию плода” в порядке возрастания.

Arrays.sort(fruits, fruitName, Arrays.ASCENDING);

Для сортировки массива объектов по его “количеству” в порядке возрастания.

Arrays.sort(fruits, quantity, Arrays.DESCENDING);

Ссылка

  1. Сопоставимая документация
  2. Документация компаратора

Оригинал: “https://mkyong.com/java/java-object-sorting-example-comparable-and-comparator/”