Scala高阶:详解关于scala中的比较器

引导

scala中的排序,底层使用的java中的排序

所以在scala的排序之前,先看看java是如何使用接口 进行自定义排序的

1.使用comparator方法进行排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序:comparator 方法进行排序
 */
public class Man1 {
    private String name;
    private int age;

    private Man1(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Man{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args) {
        Man1 man1 = new Man1("man1", 32);
        Man1 man2 = new Man1("man2", 18);
        Man1 man3 = new Man1("man3", 36);

        List<Man1> mans = new ArrayList<>();

        mans.add(man1);
        mans.add(man2);
        mans.add(man3);

        Collections.sort(mans, new Comparator<Man1>() {
            @Override
            public int compare(Man1 o1, Man1 o2) {
                return o1.age - o2.age;
            }
        });

        //自定义排序规则,按照最简单的升序排序
        for (Man1 Man : mans) {
            System.out.println(Man);
        }
    }
}

2.使用Comparable方法进行排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 排序
 * 1)comparator 方法进行排序
 * 2)comparable 方法进行排序
 */
public class Man2 implements Comparable<Man2>{

    public static void main(String[] args) {
        Man2 man1 = new Man2("man1",32);
        Man2 man2 = new Man2("man2",18);
        Man2 man3 = new Man2("man3",36);

        List<Man2> mans = new ArrayList<>();

        mans.add(man1);
        mans.add(man2);
        mans.add(man3);

        Collections.sort(mans);

        for (Man2 Man :mans){
            System.out.println(Man);
        }

    }

    private String name;
    private int age;

    private Man2(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Man{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    //自定义排序规则,按照最简单的升序排序
    @Override
    public int compareTo(Man2 o) {
        return this.age - o.age;
    }
}

scala中的自定义排序

scala中的自定义排序,都是继承了java的自定义排序接口 

在Ordering.scala和 Ordered.scala的源码中可以看到

  • Ordering继承了Comparator接口
  • Ordered继承了Comparable接口

去注释后的源码如下:

package scala
package math

import java.util.Comparator

trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
 ······
}
package scala
package math

import scala.language.implicitConversions

trait Ordered[A] extends Any with java.lang.Comparable[A] {

  def compare(that: A): Int

  def <  (that: A): Boolean = (this compare that) <  0

  def >  (that: A): Boolean = (this compare that) >  0

  def <= (that: A): Boolean = (this compare that) <= 0

  def >= (that: A): Boolean = (this compare that) >= 0

  def compareTo(that: A): Int = compare(that)
}

object Ordered {
  implicit def orderingToOrdered[T](x: T)(implicit ord: Ordering[T]): Ordered[T] =
    new Ordered[T] { def compare(that: T): Int = ord.compare(x, that) }
}

同样我们使用scala实现上面java的例子

1.使用Orderding实现

object SortedApp {

  def main(args: Array[String]): Unit = {

    //实现思路,Man继承Ordeed里的compared方法实现的,里面有隐式转换
    val man1 = new Man("man1", 32)
    val man2 = new Man("man2", 18)

    implicit val comparator: Ordering[Man] = new Ordering[Man] {
      override def compare(x: Man, y: Man): Int = x.age - y.age
    }

    println(new MaxValue(man1, man2).compare)
  }
}

class Man(val name: String, val age: Int) {

  override def toString: String = s"$name\t$age"
}

// : 为上下文界定
class MaxValue[T: Ordering](x: T, y: T)(implicit comparator: Ordering[T]) {

  //comparator为隐式参数
  def compare: T = if (comparator.compare(x, y) < 0) x else y
}

2.使用Orderded实现

object SortedApp {

  def main(args: Array[String]): Unit = {
    //实现思路,Man继承Ordeed里的compared方法实现的,里面有隐式转换
    val man1 = new Man("man1", 32)
    val man2 = new Man("man2", 18)

    println(new MaxValue(man1, man2).compare)
  }
}

class Man(val name: String, val age: Int) extends Ordered[Man] {
  override def compare(that: Man): Int = this.age - that.age

  override def toString: String = s"$name\t$age"
}

class MaxValue[T <: Ordered[T]](x: T, y: T) {

  def compare: T = if (x.compareTo(y) < 0) x else y
}

在上面的例子,在Man的类中,Man继承了Ordered这个类,里面发生了隐式转换,我们也可以自己手动实现隐式转换

object SortedApp2 {

  def main(args: Array[String]): Unit = {

    implicit def userToOrderedUser(man:Man): Ordered[Man] = new Ordered[Man]{
      override def compare(that: Man): Int = man.age - that.age
    }

    //实现思路,Man继承Ordeed里的compared方法实现的,里面有隐式转换
    val man1 = new Man("man1", 32)
    val man2 = new Man("man2", 18)

    println(new MaxValue(man1, man2).compare)


  }
}

class Man(val name: String, val age: Int) {

  override def toString: String = s"$name\t$age"
}

class MaxValue[T <% Ordered[T]](x: T, y: T) {

  def compare: T = if (x.compareTo(y) < 0) x else y
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值