Sorting 如何在OCL中按两个参数排序?

Sorting 如何在OCL中按两个参数排序?,sorting,ocl,Sorting,Ocl,我需要按两个参数对人员集合进行排序,一个是姓氏,另一个是姓名。如何在OCL中执行类似的操作?函数使用在其主体中表示的标准对元素进行排序,OCL sortedBy(lambda)似乎与Java的排序(comparator)非常不同,显然需要对象的投影作为排序的度量。但是,如果投影是self,那么您就有了不同的Java功能。因此,如果使用(p | p)进行排序,则排序取决于p的

我需要按两个参数对人员集合进行排序,一个是姓氏,另一个是姓名。如何在OCL中执行类似的操作?

函数使用在其主体中表示的标准对元素进行排序,
OCL sortedBy(lambda)似乎与Java的排序(comparator)非常不同,显然需要对象的投影作为排序的度量。但是,如果投影是self,那么您就有了不同的Java功能。因此,如果使用(p | p)进行排序,则排序取决于p的<操作

为了实现这一点,未来OCL的Eclipse OCL原型引入了OclComparable类型和compareTo方法,只要自定义类型扩展了OclComparable类型,就可以实现所有关系操作


(使用zero()和sum()操作的类似oclsumable一般支持Collection::sum();例如,String将sum实现为串联。)

谢谢你启发了我。我刚才提出的案文是:

sortedBy迭代为排序问题提供了一个优雅的解决方案,其中排序度量是排序对象的投影。因此,sortedBy(p | p.name)或just sortedBy(name)很短,避免了在涉及两个对象比较的更传统的论述中出现打字错误的机会。对于具有非平凡指标的大型集合,自然解决方案可能是一种有效的解决方案

然而,sortedBy解决方案对于新手来说并不熟悉,因此容易混淆,并且不适合多键排序,因为可能需要构造人工复合单键

一种解决方案可能是提供一个更为传统的迭代器,例如sort(p1,p2 |比较表达式),允许使用双键排序:

排序(p1,p2 |让diff1=p1.key1.compareTo(p2.key1)输入 if diff1 0 diff1 else p1.key2.compareTo(p2.key2)endif)

然而,它的可读性很差,并且有大量的打字机会

或者,使用元组值度量的sortedBy可能支持多个键,如下所示:

sortedBy(元组{first=key1,second=key2})

(元组部分名称的字母顺序决定了优先级。)


(由于sortedBy声明清晰、紧凑,低效的小型/琐碎实现可以优化为它们的sort()等价物。)

在我看来,这个解决方案不会在所有情况下都有效,我需要一些通用的解决方案。例如,如果我们有两个日期,这个解决方案将是错误的。例如,项目开始的日期和项目完成的日期。在这种情况下,我可以使用什么?正如我所说的,这个解决方案在您使用姓名/姓氏的特定情况下有效,它将使用字典顺序。我不确定,但我认为OCL sortedBy函数不能执行这两个条件搜索。在其他情况下,应该找到另一个技巧,在开始/结束日期示例中,您可以使用结束/开始日期计算每个项目花费的时间,并使用此条件对它们进行排序。否则,以yyy-mm-dd格式翻译日期(明显带有符号0),字典顺序的字符串技巧应该可以工作。
c->sortedBy(p | p.surname)
c->sortedBy(p | p.surname + '_' + p.name)