gpt4 book ai didi

java - 使用 Bi 谓词对数组进行排序

转载 作者:行者123 更新时间:2023-12-01 19:06:52 28 4
gpt4 key购买 nike

我试图获取一个排序的File[]数组(具有应用于它的特定排序条件)我尝试对与第一次排序具有相似排序结果的不同对象应用额外的排序(例如 - 文件大小)。

我编写了以下代码,但它不起作用:

private static void sameValueHandler(File[] orderedFiles, BiPredicate<File,File> sortingCondition){ 
for(int i = 0; i < orderedFiles.length - 1; i++){
int j;
for (j = i + 1; j < orderedFiles.length ; j++){
if (!sortingCondition.test(orderedFiles[i],orderedFiles[j])){
if (j - i - 1> 1){
File[] sameFiles = new File[j - i - 1];
System.arraycopy(orderedFiles, i, sameFiles, 0,j - i - 1);
sameFiles = MainOrder.defaultOrd(sameFiles); // Calls a method that sorts (files by file.getAbsolutePath())

System.arraycopy(sameFiles, 0, orderedFiles, i,j - i - 1);
}else{
break;
}
}
}
i = j;

}
}

基本上,我想做的就是检查 orderedFiles 中的哪些文件与给定 BiPredicate 共享相同的 sortingCondition,并使用 MainOrder 对这些文件进行排序.defaultOrd()file.getAbsolutePath() 排序,因此结果应该是一个使用给定 BiPredicate 进行初始排序的排序数组(假设 File[]orderedFiles 已排序) - 然后使用 deafaultOrd 方法再次重新调用共享相同 sortingCondition 的文件,同时保留具有唯一 sortingCondition 结果的原始文件。

例如:

假设我在 orderedFiles 中有以下文件:

-file2.txt

-file1.txt

-file5.txt

-file6.txt

file1 和 file2 共享相同的 fileSize,但 file2.getAbsolutePath().compareTo(file1.getAbsolutePath()) > 0

我想重新排列数组,使 file2 出现在 file1 之后:

-file1.txt

-file2.txt

-file5.txt

-file6.txt

希望我说得足够清楚。谢谢!

编辑:

也尝试过使用冒泡排序,但效果不佳:

 private static void sameValueHandler(File[] orderedFiles, BiPredicate<File,File> sortingCondition){
//TODO fix.
int arrLength = orderedFiles.length;
for(int i = 0; i<arrLength-1; i++){
for(int j=0; j<arrLength-i-1;j++){
if(sortingCondition.test(orderedFiles[j],orderedFiles[j+1])){
if(orderedFiles[j].getAbsolutePath().compareTo(orderedFiles[j+1].getAbsolutePath()) > 0){
File temp = orderedFiles[j];
orderedFiles[j] = orderedFiles[j+1];
orderedFiles[j+1] = temp;

}
}
}
}

最佳答案

您可以将Arrays.sort(T[], Comparator)与以下Comparator结合使用,首先按文件长度排序,然后按文件路径排序(如果文件长度相等):

File[] files = ...;
Arrays.sort(files, new Comparator<File>() {
@Override
public int compare(File f1, File f2) {
int result = Long.compare(f1.length(), f2.length());
if(result == 0) {
result = f1.getAbsolutePath().compareTo(f2.getAbsolutePath());
}
return result;
}
});

关于java - 使用 Bi 谓词对数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535805/

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