Java 接受Scala中的匿名比较器?
如何接受将函数作为参数传递给scala中的Vector.sortBy() 目前我有这样一个功能: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:
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)
。