所以我尝试使用比较器接口(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/