java - 为什么我的数组列表没有使用比较器接口(interface)进行排序?

标签 java sorting collections comparator

所以我尝试使用比较器接口(interface)对仅由整数元素按降序排列的数组列表进行排序,但在打印数组列表后,它会按照给出输入的顺序显示元素。

这是我的代码...

import java.io.*;
import java.util.*;
public class Test {
    public static class Sort implements Comparator<Integer>{
        public int compare(Integer a,Integer b){
            if(a<b){
                return 1;
            }
            return 0;
        }
    }
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(br.readLine());
        ArrayList<Integer> arraylist=new ArrayList<>();
        for(int i=0;i<n;i++){
            arraylist.add(Integer.parseInt(br.readLine()));
        }
        Collections.sort(arraylist,new Sort());
        System.out.println(arraylist);
        br.close();
    }
}

所以我学到的是,如果比较方法返回一个正值,那么就会发生对象交换。所以我返回了1如果 a<b用于按降序对数组进行排序。我哪里做错了?

最佳答案

正如评论所讨论的,您的代码违反了 Comparator 契约(Contract)的条款。 Per Jon Skeet ,Javadoc 解释说“实现者必须确保所有 x 和 y 的 sgn(compare(x, y)) == -sgn(compare(y, x))。”

而且,你工作太辛苦了。

如果您想颠倒顺序,降序而不是升序,只需调用 Comparator#reversed .此调用返回一个新的 Comparator 对象供您使用。

由于 Integer 类实现了 Comparable,因此您无需定义初始比较器。只需调用 Comparator#reverseOrder。此调用反转对象的自然顺序。

List< Integer > myList = new ArrayList <> ( List.of( 7 , 1 , 42 ) ) ;
myList.sort( Comparator.reverseOrder() );

查看 code run live at IdeOne.com .

[7, 1, 42]

[42, 7, 1]

关于java - 为什么我的数组列表没有使用比较器接口(interface)进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70617973/

相关文章:

java - 如何正确排序包含字符串和数字的 ArrayList<String>?

java - 排序列表 <Number>

java - 任何人都可以向我解释这个 Java 问题吗?

java - 渐变 : Couldn't determine java version from '11.0.1'

java - jsf:请求的资源不可用

java - Antlr4:防止规则和 token 冲突

Java - 将字母字符串转换为相应 ascii 的整数?

c# - Winforms ListView C# 中的 collection.Insert(0, newItem) 与 list.Add(newItem) + Sort 更快吗?

algorithm - 在 O(n) 中查找 2^k 个最大元素

java - 根据字符串键中的标记对 JAVA 映射键进行分组