当前位置: 首页 > 知识库问答 >
问题:

使用Bi谓词排序数组

彭宏义
2023-03-14

我试图获取一个已排序的<代码>文件[] 数组(对其应用了特定的排序条件),并尝试对具有与第一次排序相似的排序结果的不同对象应用额外的排序(例如,文件大小)。

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

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共享相同的sorting条件从给定的BiPredicate,并排序这些文件与MainOrder.defaultOrd()排序按file.getAbsoltePath(),所以结果应该是一个排序数组,用给定的BiPredicate进行初始排序(假设File[]orderedFiles已经排序)-然后使用deafaultOrd方法调用共享相同排序条件的文件AGAIN,同时保留具有唯一排序条件结果的原始文件。

例如:

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

-文件2.txt

-file1.txt

-文件5.txt

-文件6.txt

和file1和file2共享相同的文件大小,但file2.getABSOLTEPath(). compareTo(file1.getAbSOLTEPath())

我希望使用数组,以便file2出现在file1之后:

-file1.txt

-文件2.txt

-文件5.txt

-文件6.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;

                    }
                }
            }
        }

共有3个答案

慕阳文
2023-03-14

您可以使用单一排序来执行此操作。您需要对数组进行如下排序:

    Arrays.sort(orderedFiles,
                Comparator.comparing(File::length)
                        .thenComparing(
                                File::getAbsolutePath));

数组的第二个参数。sort是一个比较器,可以在JavaDocs中阅读。

首先,它按长度排序,如果长度相等,则按路径排序。您可以根据需要链接任意多个方法,然后进行比较。如果文件已在第一个字段上排序,则影响最小。它仍然可以正常工作。或者,您可以按以下方式执行:

     Arrays.sort(orderedFiles,
             Comparator.comparing(File::getAbsolutePath));
                        .

下面是一个it处理一些虚构数据的示例。当您运行它并打印出排序列表时,您可以看到它是如何首先对名称的值进行排序,然后再对名称的长度进行排序的。

        List<Example> data = new ArrayList<>(
                List.of(new Example(20, "watermelon"),
                        new Example(20, "apple"),
                        new Example(20, "peaches"),
                        new Example(10, "grapes"),
                        new Example(100, "house"),
                        new Example(100, "apartment")));
        data.sort(Comparator.comparing(Example::getValue)
                .thenComparing(a -> a.getName().length()));

        data.forEach(System.out::println);



    class Example {
        private int value;
        private String name;

        public Example(int value, String name) {
            this.value = value;
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public int getValue() {
            return value;
        }

        public String toString() {
            return value + " " + name;
        }



徐博雅
2023-03-14

首先,您必须了解comparator的工作原理(来自Java文档):

if file1 > file2, it returns positive number  
if file1 < file2, it returns negative number  
if file1 == file2, it returns 0  

说:

    public static Comparator<File> secondSort = (f1, f2) -> {
        // apply the second sort rules and return -1, 0, 1 based on Comparator returns
        return 0; // -1, 0, 1
    };

    public static Comparator<File> sortIt = (f1, f2) -> {
        // check if files are equals base in your first rule
        boolean filesAreEquals = true;

        if (filesAreEquals) {
            return secondSort.compare(f1, f2);
        }
        return 0;
    };

    private static void sameValueHandler(File[] orderedFiles) 
    {        
        List<File> ordered = Arrays.
                stream(orderedFiles).
                sorted(sortIt::compare).
                collect(Collectors.toList());
    }

它允许您将不同的比较器传递给您的方法并更改元素的排序方式。

邓德惠
2023-03-14
匿名用户

您可以使用数组。使用以下比较器排序(T[],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;
    }
});

 类似资料:
  • 问题内容: 我有一个列表列表,例如第3个值始终为或。我该如何调用以使列表基于以下内容进行排序: 第一个索引 如果第一个索引相同,则排在第一位。 谢谢 问题答案: 编写一个自定义函数。

  • 对哈斯克尔来说真的很新鲜,我想不通。如何检查给定二叉树中的是否大于其子节点? 函数< code>descendingTree将获得一个< code>IntTree并将返回给我一个Boolean值,表明对于树中的每个节点,该节点的值是否大于其两个子节点的值;如果它有孩子的话。这个函数怎么写?

  • 问题内容: 我正在为我的第一个应用程序浏览本教程(学习Swift):http : //www.appcoda.com/search-bar-tutorial- ios7/ 我被困在这部分(Objective-C代码): 谁能建议如何在Swift中为NSPredicate创建等效项? 问题答案: 这实际上只是语法切换。好,所以我们有这个方法调用: 在Swift中,构造函数跳过“ blahWith…”

  • 我需要@query的原因是应用基于身份验证主体的安全性。 存储库的完整代码:

  • 问题内容: 我必须使用python计算文本中的单词频率。我想到将单词保留在字典中,并对每个单词进行计数。 现在,如果我必须根据出现次数对单词进行排序。我可以使用相同的词典来代替使用具有键作为计数和单词数组作为值的新词典吗? 问题答案: 您可以使用相同的字典: 第二行显示: 如果只需要排序的单词列表,请执行以下操作: 该行打印:

  • 谓词是指用方括号写的XPath表达式。 它指的是为某些条件限制节点集中的选定节点。 例如, 序号 序号 描述 1 选择第一个元素,它是元素的子元素。 2 选择最后一个元素,它是元素的子元素。 3 使用选择元素。 4 选择大于的元素。 示例 此示例通过迭代每个学生创建一个包含其详细信息的元素。 它计算节点的位置,然后打印学生的详细信息以及序列号。 文件:students.xml - 文件:stude