Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.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
Java 接受Scala中的匿名比较器?_Java_Scala - Fatal编程技术网

Java 接受Scala中的匿名比较器?

Java 接受Scala中的匿名比较器?,java,scala,Java,Scala,如何接受将函数作为参数传递给scala中的Vector.sortBy() 目前我有这样一个功能: private def buildTree(data: Vector[Data2D]): Node = { var sorted: Vector[Data2D] = data.sortBy(_.x) // etc... } private def buildTree(data: Vector[Data2D], comparator): Node = { var sorted:

如何接受将函数作为参数传递给scala中的Vector.sortBy()

目前我有这样一个功能:

private def buildTree(data: Vector[Data2D]): Node = {
   var sorted: Vector[Data2D] = data.sortBy(_.x)
   // etc...
 }
private def buildTree(data: Vector[Data2D], comparator): Node = {
   var sorted: Vector[Data2D] = data.sortBy(comparator)
   // etc...

   if(comparator == _.x){
       buildTree(data, _.y)
   }

 }
但是,我想将“x.x”(在x上排序)或“x.y”作为参数传递给函数,因此我可以执行以下操作:

private def buildTree(data: Vector[Data2D]): Node = {
   var sorted: Vector[Data2D] = data.sortBy(_.x)
   // etc...
 }
private def buildTree(data: Vector[Data2D], comparator): Node = {
   var sorted: Vector[Data2D] = data.sortBy(comparator)
   // etc...

   if(comparator == _.x){
       buildTree(data, _.y)
   }

 }
所以我想检查一下当前的“比较器”是什么,然后递归传递给它y坐标的比较器

我希望这是清楚的。在Java中,我将其编写为:

private Node buildTree(List<Data2D> data, Comparator<Data2D> comparator) {
 // Sorted on x or y
 Collections.sort(data, comparator);

 // ... snip ...

 if (comparator instanceof XComparator) {
    // Recurse
    Node subtree = buildTree(data, YComparator.INSTANCE);
    ret.setSubtree(subtree);
 }
 return ret;
}

// Then build tree is called like:
Node root = tree.buildTree(data, XComparator.INSTANCE)
私有节点构建树(列表数据、比较器){
//按x或y排序
收集。排序(数据、比较);
//…剪断。。。
if(XComparator的比较器实例){
//重现
节点子树=构建树(数据,YComparator.INSTANCE);
ret.setSubtree(子树);
}
返回ret;
}
//然后,构建树被称为:
节点根=tree.buildTree(数据,XComparator.INSTANCE)

实际上,您需要订购
。像这样:

class XOrdering extends Ordering[Data2D] {
    override def compare(x: Data2D, y: Data2D): Int = Ordering.Int(x.x, y.x)
}

class YOrdering extends Ordering[Data2D] {
    override def comapre(x: Data2D, y: Data2D): Int = Ordering.Int(x.y, y.y)
}

private def buildTree(data: Vector[Data2D], ordering: Ordering[Data2D]): Node = {
   var sorted: Vector[Data2D] = data.sorted(ordering)
   // etc...

   ordering match {
     case _: XOrdering => buildTree(data, YOrdering)
     case _: YOrdering => buildTree(data, XOrdering)
     case _ => error("I don't know what that ordering is!")
   }
 }

sortBy
方法只是为您创建一个
排序
sortBy(ux)
相当于
sorted(Ordering.by(x))
如果检查文档,您会看到
sortBy
包含一个参数:
f:A=>B
。看起来像是一个通用函数,它将
a
作为参数并生成
B
。那么,让我们试一试:

val orderX = (d: Data2D) => d.x
val orderY = (d: Data2D) => d.y
它定义了我们想要的两个函数。现在我们可以打电话了

data.sortBy(orderer)
和测试

if (orderer==orderX) buildTree(data, orderY)

(虽然我建议将两个比较器作为参数传递,而不是搜索特定常数)。

对不起,“比较器”是从哪里来的?@drozzy对不起,我不太理解你的问题。我会试着修改这个。谢谢,这说明了这一点。就在你有一个没有在任何地方定义的“比较器”变量之前…传递两个比较器而不是搜索特定常数是什么意思?另外,你能告诉我buildTree方法签名的外观吗?谢谢
def构建树(数据:Vector[Data2D],Orders:(Data2D=>Int,Data2D=>Int)
,假设
Data2D
具有
Int
s。您使用
Orders.\u 1
排序,使用
Orders.swap
,并传入外部调用
(\ux,\uu.y)