Смешивание Java со Scala для использования изменяемого TreeMap
В 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());
Если я хочу создать изменяемый Java TreeMap из Scala, я могу сделать что-то вроде этого:
var treeMap = new java.util.TreeMap[Double,MyObject]
Как мне реализовать компаратор Java в Scala, чтобы я мог сортировать по возрастанию или убыванию? Здесь я предполагаю, что не могу смешать черту Scala Ordering с коллекцией Java. Кроме того, кто-нибудь знает, будет ли в Scala изменяемая переменная TreeMap?
2 ответа
Решение
Ты можешь использовать 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])
Черта Скала Ordering
расширяет интерфейс Java Comparator
так что вы можете сделать это кратко:
val treeMap = new java.util.TreeMap[Double, String](Ordering.Double.reverse)