gpt4 book ai didi

java - scala sortWith 不起作用

转载 作者:行者123 更新时间:2023-11-30 02:55:10 25 4
gpt4 key购买 nike

我需要在 scala 上制作 java ArrayList

它是类、文件-字段的排序方法。要使用 ArrayList,我导入了 java.util.ArrayList 和 scala.collection.JavaConversions._

other imports ...
import java.io.File
import java.util.ArrayList
import scala.collection.JavaConversions._

class SortReplays(val files:ArrayList[File]) {
def sort(kindOfSort:String) = {
kindOfSort match {
case "name" => files.sortWith(compareFileNames);
case "length" => files.sortWith(compareGameLength);
case "date" => files.sortWith(compareGameDates);
}
}

这是比较器之一,也是SortReplays的方法

def compareGameLength(file1:File, file2:File) = {
val length1:Long = ReplayViewerController.getGameLength(file1)
val length2:Long = ReplayViewerController.getGameLength(file2)
length1 < length2
}

这就是我在java中所做的

Service.out("scala sorting by length");
long t1 = System.currentTimeMillis();
ArrayList<File> fileList = new ArrayList<File>(Arrays.asList(files));
SortReplays sort = new SortReplays(fileList);
sort.sort("length");
Service.out("scala sort by length, time spend: " + (System.currentTimeMillis() - t1));
try {
controller.refreshLengths(fileList.toArray(new File[0]));
controller.refreshReplays(fileList.toArray(new File[0]));
} catch (Exception e1) {
e1.printStackTrace();
}

我预计文件会被排序 - 但它没有发生,花费了时间,但列出的根本没有任何变化。我也在java中做了同样的事情

public void sortLengths(ArrayList<File> files) {
Collections.sort(files, new Comparator<File>() {

@Override
public int compare(File arg0, File arg1) {
long l1;
long l2;
try {
l1 = getGameLength(arg0);
l2 = getGameLength(arg1);
if(l1 < l2)
return -1;
else if(l1 == l2)
return 0;
else
return 1;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return 0;
}
}

});
}

它按预期工作

最佳答案

问题在于 SortReplays.sort 中调用 files.sortWith 返回一个 Seq,但不修改 文件列表。

要解决此问题,您需要:

首先,从 def sort 返回一个 Java List。可以通过添加隐式转换器来解决:

import scala.collection.JavaConversions._
import scala.collection.JavaConverters._

...

private implicit def toJavaList[T](seq: Seq[T]): util.List[T] = {
new util.ArrayList(seq.asJavaCollection)
}

def sort(kindOfSort: String): util.List[File] = {
kindOfSort match {
case "name" => files.sortWith(compareFileNames);
case "length" => files.sortWith(compareGameLength);
case "date" => files.sortWith(compareGameDates);
}
}

顺便说一句,在 Scala 中为公共(public)函数指定显式返回类型是一个很好的做法(在本例中为 : util.List[File])。

ArrayList 声明也应更改为 List,以尊重程序到接口(interface)原则。

其次,在 Java 端代码中,需要进行一些更改:

SortReplays sort = new SortReplays(Arrays.asList(files));
List<File> fileList = sort.sort("length");
Service.out("scala sort by length, time spend: " + (System.currentTimeMillis() - t1));
try {
controller.refreshLengths(fileList.toArray(new File[0]));
controller.refreshReplays(fileList.toArray(new File[0]));
} catch (Exception e1) {
e1.printStackTrace();
}

顺便说一句,避免捕获Exception,这很难看。

关于java - scala sortWith 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37452517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com