通过第一个元素反向,第二个元素常规对元组进行排序

时间:2015-06-03 05:10:47

标签: scala sorting

我有(Boolean, Int, String)形式的元组。

我想定义Ordering,它按以下顺序对元组进行排序:

  1. 布尔值 - 逆序

  2. Int - 逆序

  3. 字符串 - 常规订单

  4. 示例:

    对于元组:Array((false, 8, "zz"), (false,3, "bb"), (true, 5, "cc"),(false, 3,"dd"))

    订购应该是:

    (true, 5, "cc")
    
    (false, 8,"zz")
    
    (false, 3, "bb")
    
    (false, 3, "dd")
    

    我无法找到一种方法来定义一些反向排序和一些常规排序。

2 个答案:

答案 0 :(得分:12)

在这种特定情况下的直接解决方案是在元组上使用sortBy,在运行中修改为"反转"第一个和第二个元素,以便最终排序顺序:

val a = Array((false, 8, "zz"), (false,3, "bb"), (true, 5, "cc"),(false, 3,"dd"))
a.sortBy{ case (x,y,z) => (!x, -y, z) }

如果你不能轻易地"反转"一个值(比如说这是一个参考对象,你对它们进行了不透明的排序),你可以改用 sorted并显式传递构造的顺序以反转第一个和第二个元素的顺序(您可以使用Ordering.reverse来反转排序):

val myOrdering: Ordering[(Boolean, Int, String)] = Ordering.Tuple3(Ordering.Boolean.reverse, Ordering.Int.reverse, Ordering.String)
a.sorted(myOrdering)

答案 1 :(得分:-1)

你可以这样做。

Mutex mutex;

try
{
   mutex = Mutex.OpenExisting("SINGLEINSTANCE");

   if (mutex!= null)
   {
         Console.WriteLine("Error, 1 instance Only");
         Application.Exit();
    }
 }
 catch (WaitHandleCannotBeOpenedException ex)
 {
        mutex  = new Mutex(true, "SINGLEINSTANCE");
 }