ソートComparator.comparing比較

外部ソートコンパレータを使用してコンパレータ

私たちは集合の要素をソートする必要があるときは、ソートするコンパレータを作成はjava.util.Comparatorを使用することができます。コンパレータインタフェースは、関数インタフェースで、我々は、ラムダ式を使用することができます。次の例では、

package com.common;

import java.util.*;
import java.util.stream.Collectors;

public class ComparatorTest { public static void main(String[] args) { Employee e1 = new Employee("John", 25, 3000, 9922001); Employee e2 = new Employee("Ace", 22, 2000, 5924001); Employee e3 = new Employee("Keith", 35, 4000, 3924401); List<Employee> employees = new ArrayList<>(); employees.add(e1); employees.add(e2); employees.add(e3); /** * @SuppressWarnings({"unchecked", "rawtypes"}) * default void sort(Comparator<? super E> c) { * Object[] a = this.toArray(); * Arrays.sort(a, (Comparator) c); * ListIterator<E> i = this.listIterator(); * for (Object e : a) { * i.next(); * i.set((E) e); * } * } * * sort 对象接收一个 Comparator 函数式接口,可以传入一个lambda表达式 */ employees.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); Collections.sort(employees, (o1, o2) -> o1.getName().compareTo(o2.getName())); employees.forEach(System.out::println); } } /** * [Employee(name=John, age=25, salary=3000.0, mobile=9922001), * Employee(name=Ace, age=22, salary=2000.0, mobile=5924001), * Employee(name=Keith, age=35, salary=4000.0, mobile=3924401)] */ class Employee { String name; int age; double salary; long mobile; // constructors, getters & setters public Employee(String name, int age, double salary, long mobile) { this.name = name; this.age = age; this.salary = salary; this.mobile = mobile; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public long getMobile() { return mobile; } public void setMobile(long mobile) { this.mobile = mobile; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Employee{"); sb.append("name='").append(name).append('\''); sb.append(", age=").append(age); sb.append(", salary=").append(salary); sb.append(", mobile=").append(mobile); sb.append('}'); return sb.toString(); } }

 

ソートComparator.comparingを使用して

方法を比較します

コンパレータクラスは、以下のことを達成するために、比較する方法があり、内部ビューを実装します

    public static <T, U extends Comparable<? super U>> Comparator<T> comparing( Function<? super T, ? extends U> keyExtractor) { Objects.requireNonNull(keyExtractor); return (Comparator<T> & Serializable) (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2)); } 

戻り値は(C1、C2) - > keyExtractor.apply(C1).compareTo(keyExtractor.apply(C2)); Compatorあるラムダ式、。したがって、上記の例でも、次のように変換することができます

package com.common;

import java.util.*;

public class ComparatorTest { public static void main(String[] args) { Employee e1 = new Employee("John", 25, 3000, 9922001); Employee e2 = new Employee("Ace", 22, 2000, 5924001); Employee e3 = new Employee("Keith", 35, 4000, 3924401); List<Employee> employees = new ArrayList<>(); employees.add(e1); employees.add(e2); employees.add(e3); /** * @SuppressWarnings({"unchecked", "rawtypes"}) * default void sort(Comparator<? super E> c) { * Object[] a = this.toArray(); * Arrays.sort(a, (Comparator) c); * ListIterator<E> i = this.listIterator(); * for (Object e : a) { * i.next(); * i.set((E) e); * } * } * * sort 对象接收一个 Comparator 函数式接口,可以传入一个lambda表达式 */ employees.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); Collections.sort(employees, (o1, o2) -> o1.getName().compareTo(o2.getName())); employees.forEach(System.out::println); /** * Comparator.comparing 方法的使用 * * comparing 方法接收一个 Function 函数式接口 ,通过一个 lambda 表达式传入 * */ employees.sort(Comparator.comparing(e -> e.getName())); /** * 该方法引用 Employee::getName 可以代替 lambda表达式 */ employees.sort(Comparator.comparing(Employee::getName)); } } /** * [Employee(name=John, age=25, salary=3000.0, mobile=9922001), * Employee(name=Ace, age=22, salary=2000.0, mobile=5924001), * Employee(name=Keith, age=35, salary=4000.0, mobile=3924401)] */ class Employee { String name; int age; double salary; long mobile; // constructors, getters & setters public Employee(String name, int age, double salary, long mobile) { this.name = name; this.age = age; this.salary = salary; this.mobile = mobile; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } public long getMobile() { return mobile; } public void setMobile(long mobile) { this.mobile = mobile; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Employee{"); sb.append("name='").append(name).append('\''); sb.append(", age=").append(age); sb.append(", salary=").append(salary); sb.append(", mobile=").append(mobile); sb.append('}'); return sb.toString(); } }

 

方法2を比較

    public static <T, U> Comparator<T> comparing( Function<? super T, ? extends U> keyExtractor, Comparator<? super U> keyComparator) { Objects.requireNonNull(keyExtractor); Objects.requireNonNull(keyComparator); return (Comparator<T> & Serializable) (c1, c2) -> keyComparator.compare(keyExtractor.apply(c1), keyExtractor.apply(c2)); }

そして、異なる比較するための方法は、プロセス1つの以上のパラメータkeyComparatorは、keyComparatorがカスタムコンパレータを作成することであるということです。

Collections.sort(employees, Comparator.comparing(
                Employee::getName, (s1, s2) -> {
                    return s2.compareTo(s1); })); 

 

使用Comparator.reversedの ソート

照合は反対に返し、

/**
 *  相反的排序规则
 */
Collections.sort(employees, Comparator.comparing(Employee::getName).reversed()); employees.forEach(System.out::println); 

出力、

Employee{name='Keith', age=35, salary=4000.0, mobile=3924401}
Employee{name='John', age=25, salary=3000.0, mobile=9922001} Employee{name='Ace', age=22, salary=2000.0, mobile=5924001}

 

使用コンパレータ。 NullsFirstソート

コレクション内のnull要素がある場合、あなたは、コレクションの最上部に、コンパレータ優しいnullをnull要素を使用することができます

employees.add(null);  //插入一个null元素
Collections.sort(employees, Comparator.nullsFirst(Comparator.comparing(Employee::getName)));
employees.forEach(System.out::println);


Collections.sort(employees, Comparator.nullsLast(Comparator.comparing(Employee::getName)));
employees.forEach(System.out::println);

 

使用  コンパレータ ThenComparingソート

まず、EGEを使用してソートすることによって、その後ソート名を、使用しての使用の効果を見て

Collections.sort(employees, Comparator.comparing(Employee::getAge).thenComparing(Employee::getName)); employees.forEach(System.out::println); 

 

 

転載:https://my.oschina.net/xinxingegeya/blog/2046405

おすすめ

転載: www.cnblogs.com/xiaoshen666/p/11083919.html