代码之家  ›  专栏  ›  技术社区  ›  AZ_

scala按顺序对集合排序

  •  1
  • AZ_  · 技术社区  · 6 年前

    我是斯卡拉的初学者。我想对一个集合进行排序,然后为用户提供新的排序集合,这样旧的集合应该保持不变。

    我已经有了一个类似于example basetrait[+a]的特性,我想丰富它。

    trait BaseSet[+A] { //it extends scala Set
    
      def +[B >: A](item: B): BaseSet[B]
    
      def -[B >: A](item: B): BaseSet[B]
    
      def size: Int
    
      def contains[B >: A](item: B): Boolean  
    
    }
    
    trait SetWithSort[+A] extends BaseSet[A] {
    
      abstract def sort[B](implicit ordering: Ordering[_ >: B]): Set[B]
    
      def logicBeforeSorting(): Set[B] ={
        sort
      }
    }
    
    object MainObject {
      def OrderByName:Ordering[String] => Set[String] = ???  
    
      def execute[T](callback:Ordering[T]): Ordering[T] = callback //Problem, I // want Set[T] here
    
    // I want to get a new Set with elements sorted as per my provided ordering 
    
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Andrzej Sołtysik    6 年前

    您可以使用注释中提到的sortedset,例如:

    import scala.collection.SortedSet
    
    def sortSet[A](unsortedSet: Set[A])(implicit ordering: Ordering[A]): SortedSet[A] = 
        SortedSet.empty[A] ++ unsortedSet
    

    如果提供类型为的隐式参数 Ordering[A] ,将使用此顺序。

    使用默认顺序:

    sortSet(Set(2, -1, 0, -2, 1)) // result TreeSet(-2, -1, 0, 1, 2)
    

    因为scala已经提供了一个隐式 Ordering[Int] 在范围内

    随附订单使用:

    implicit val reverseOrdering = Ordering[Int].reverse
    sortSet(Set(-15, 100, -3, 101, -5)) // result TreeSet(101, 100, -3, -5, -15)
    
    // or by providing ordering directly:
    val reverseOrdering = Ordering[Int].reverse
    sortSet(Set(-15, 100, -3, 101, -5))(reverseOrdering) // result TreeSet(101, 100, -3, -5, -15)