man*_*ure 3 java sorting collections comparator
因此,我尝试使用比较器接口对仅包含整数元素的数组列表进行降序排序,但在打印数组列表后,它会按照给出输入的顺序显示元素。
这是我的代码...
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();
}
}
Run Code Online (Sandbox Code Playgroud)
所以我了解到,如果比较方法返回正值,则会发生对象交换。所以我返回了1ifa<b以降序对数组进行排序。我哪里做错了?
正如评论所讨论的,您的代码违反了合同条款Comparator。根据 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() );
Run Code Online (Sandbox Code Playgroud)
[7,1,42]
[42,7,1]