将Java与Scala混合使用可变树TreeMap

时间:2011-02-03 20:27:49

标签: scala sorting treemap mutable

在Java中,我可以执行以下操作:

TreeMap<Double, String> myMap = new TreeMap<Double, String>();

如果我希望它以相反的顺序排序,我可以提供比较器,例如:

class ReverseOrder implements Comparator<Object> {

    public ReverseOrder() {

    }

    public int compare(Object o1,Object o2) {
        Double i1=(Double)o1;
        Double i2=(Double)o2;
        return -i1.compareTo(i2);
    }
}

将对象实例化为

TreeMap<Double, MyObject> myMap = new TreeMap<Double, MyObject>()(new ReverseOrder());

如果我想从Scala中创建可变的Java TreeMap,我可以这样做:

var treeMap = new java.util.TreeMap[Double,MyObject]

如何在Scala中实现Java比较器,以便我可以根据升序或降序进行排序?在这里,我假设我不能将Scala Ordering特征与Java集合混合。另外,有人知道Scala中是否可以使用可变的TreeMap吗?

2 个答案:

答案 0 :(得分:6)

您可以使用Ordering,并像这样定义ReverseOrder

case class ReverseOrder[T: Ordering] extends Comparator[T] {
  def compare(o1: T, o2: T) = -implicitly[Ordering[T]].compare(o1, o2)
}

val treeMap = new TreeMap[Double, String](ReverseOrder[Double]) 

答案 1 :(得分:3)

Scala trait Ordering扩展了Java接口Comparator,因此您可以简洁地执行此操作:

val treeMap = new java.util.TreeMap[Double, String](Ordering.Double.reverse)