Orders and TreeMap

I create MultiSet[A]and use TreeMap[A, Int]to track items.

class MultiSet[A <: Ordered[A] ](val tm: TreeMap[A, Int]) { ... }

Now I want to create MultiSet[Int]using this framework. In particular, I need a method that will accept Vector[Int]and create TreeMap[Int, Int], which I can use to create MultiSet[Int].

I wrote the following vectorToTreeMap, which compiles without complaint.

def vectorToTreeMap[A <: Ordered[A]](elements: Vector[A]): TreeMap[A, Int] =
  elements.foldLeft(new TreeMap[A, Int]())((tm, e) => tm.updated(e, tm.getOrElse(e, 0) + 1))

But when I try

val tm: TreeMap[Int, Int] = vectorToTreeMap(Vector(1, 2, 3))

I get compiler complaints saying that Intdoesn't match A <: Ordered[A]. What do you need to create TreeMap[Int, Int]in this context? (I need a more general case, because MultiSet[A]not always MultiSet[Int].)

I also tried A <: scala.math.Ordered[A]and A <: Ordering[A]but did not have the best results. (I admit that I do not understand the differences between the three possibilities and whether it matters in this situation.)

.

+4
1

, Int java int, Ordered [Int]. , java , Ordered [T].

:

:

<: <%.

def vectorToTreeMap[A <% Ordered[A]](elements: Vector[A]): TreeMap[A, Int] =
  elements.foldLeft(new TreeMap[A, Int]())((tm, e) => tm.updated(e, tm.getOrElse(e, 0) + 1))

A <: [A] , vectorToTreeMap , Ordered [A], Int.

A <% Ordered [A] , vectorToTreeMap , " ", Ordered [A], Int, , Int Ordered [Int ]:

scala> implicitly[Int => Ordered[Int]]
res7: Int => Ordered[Int] = <function1>

, - ( ) A, , A.

, , TreeMap , , , .

def vectorToTreeMap[A](elements: Vector[A])(implicit ordering:Ordering[A]): TreeMap[A, Int] =
  elements.foldLeft(new TreeMap[A, Int]())((tm, e) => tm.updated(e, tm.getOrElse(e, 0) + 1))

, Ordering [A] java, String, scala REPL:

scala> implicitly[Ordering[Int]]
res8: Ordering[Int] = scala.math.Ordering$Int$@5b748182

Scala . , Tuple, , scala :

scala> implicitly[Ordering[(Int, Int)]]
res9: Ordering[(Int, Int)] = scala.math.Ordering$$anon$11@66d51003

. , ints, , , , int, , val.

scala. :

def vectorToTreeMap[A : Ordering](elements: Vector[A]): TreeMap[A, Int] = ???

def vectorToTreeMap[A](elements: Vector[A])(implicit ordering:Ordering[A]): TreeMap[A, Int] = ???

, , vectorToTreeMap , , . vectorToTreeMap Ordering [A] Ordering [A].

:

  • , "".

  • , , . , . , caseInsensitiveOrdering Sting. String Ordered, .

scala, TreeMap.


: , :

scala> case class Person(name:String, surname:String)
defined class Person

scala> implicitly[Ordering[Person]]
<console>:10: error: No implicit Ordering defined for Person.
              implicitly[Ordering[Person]]
                        ^

. :

scala> :paste
// Entering paste mode (ctrl-D to finish)

case class Person(name:String, surname:String)

object Person {

  // just convert to a tuple, which is ordered by the individual elements
  val nameSurnameOrdering : Ordering[Person] = Ordering.by(p => (p.name, p.surname))

  // make the nameSurnameOrdering the default that is in scope unless something else is specified
  implicit def defaultOrdering = nameSurnameOrdering
}

// Exiting paste mode, now interpreting.

defined class Person
defined module Person

scala> implicitly[Ordering[Person]]
res1: Ordering[Person] = scala.math.Ordering$$anon$9@50148190
+3

Source: https://habr.com/ru/post/1526889/


All Articles