Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 使用sortWith对链式元组列表进行排序_List_Scala_Sorting_Higher Order Functions - Fatal编程技术网

List 使用sortWith对链式元组列表进行排序

List 使用sortWith对链式元组列表进行排序,list,scala,sorting,higher-order-functions,List,Scala,Sorting,Higher Order Functions,给定一个Tuple2的列表,我想对它们进行排序,以便其中一个的第二个元素是下一个的第一个元素。我试过用sortWith做,但在某些情况下有效,但在其他情况下无效。有人能看出我把事情搞砸了吗 Welcome to Scala version 2.10.3-20130923-e2fec6b28dfd73482945ffab85d9b582d0cb9f17 (OpenJDK 64-Bit Server VM, Java 1.7.0_71). Type in expressions to have th

给定一个Tuple2的列表,我想对它们进行排序,以便其中一个的第二个元素是下一个的第一个元素。我试过用sortWith做,但在某些情况下有效,但在其他情况下无效。有人能看出我把事情搞砸了吗

Welcome to Scala version 2.10.3-20130923-e2fec6b28dfd73482945ffab85d9b582d0cb9f17 (OpenJDK 64-Bit Server VM, Java 1.7.0_71).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val l = List((2,3),(1,2),(3,4))
l: List[(Int, Int)] = List((2,3), (1,2), (3,4))

scala> l.sortWith((x,y) => x._2 == y._1)
res0: List[(Int, Int)] = List((1,2), (2,3), (3,4))

scala> val m = List((2,3),(5,6),(1,2),(3,4),(4,5))
m: List[(Int, Int)] = List((2,3), (5,6), (1,2), (3,4), (4,5))

scala> m.sortWith((x,y) => x._2 == y._1)
res1: List[(Int, Int)] = List((2,3), (5,6), (1,2), (3,4), (4,5))

非常感谢

sortWith基本上说,如果条件为真,那么第一个arg应该位于第二个arg之前,如果条件为假,那么应该以另一种方式排序。对于绝大多数的比较来说,你的sortWith条件返回false,这将把事情推向右边,即使在之前的比较中说事情应该更向左

简而言之,你的排序不一致,结果也不一致

在你能提出一个通用的解决方案之前,你必须先处理一些问题空间中的深层次问题。基本上,您要做的是对任意有向图进行排序。这意味着它可以有循环、断开连接的子图,以及各种各样的其他东西,这些东西排除了任何明显的总排序

但是如果我们可以假设你避免了循环,那么拓扑排序可能会给你一些更像你所寻找的结果的东西。基本上,你需要的属性不仅仅是“如果这一个的右点等于那一个的左点,就把这个放在那一个之前”,而是更像“如果[所有这些]我们没有足够的信息来比较它们,就把这个放在那一个之前。”sortWith不够复杂,无法进行拓扑排序。它假设所有元素都可以直接进行有意义的比较


拓扑排序的快速介绍

如果您查看用于
sortWith
比较器
,您会发现:

def sortWith(lt: (A, A) => Boolean): Repr = sorted(Ordering fromLessThan lt)

def fromLessThan[T](cmp: (T, T) => Boolean): Ordering[T] = new Ordering[T] {
    def compare(x: T, y: T) = if (cmp(x, y)) -1 else if (cmp(y, x)) 1 else 0
例如,当底层算法比较
(5,6)
(1,2)
时,它将首先检查
6
不等于
1
,然后检查
2
不等于
5
,最后确定这些元组相等。因此,您应该使用以下内容:

x._2 <= y._1 // for tuples where _1 < _2
x._2 >= y._1 // for tuples where _1 > _2
x.\u 2=y.\u 1//对于其中_1>\u 2的元组

Sorted不起作用。例如,它向后排序(3,2),(2,1)。嗯,我评论的评论被删除了,所以现在看起来我的评论是指向OP的。有一条评论说使用“排序”而不是“sortWith”,这仍然是不对的。想象一下,在某个时刻,你正在比较(1,2),(3,4)。哪一个应该先来?答:完全不知道。下一对可能是(2,3),在这种情况下你需要一个订单,或者可能是(4,1),在这种情况下你需要另一个订单。对于
(1,2),(3,4)
,因为
2\u 2
,所以
(1,2)
(3,4)
(4,1)