Así que intenté ordenar una lista de matrices que consiste solo en elementos enteros en orden descendente usando la interfaz del comparador, pero después de imprimir la lista de matrices, muestra los elementos en el orden en que se proporcionó la entrada.
aqui esta mi codigo...
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(); } } Entonces, lo que aprendí es que si el método de comparación devuelve un valor positivo, entonces se produce el intercambio de objetos. Así que devolví 1 si a<b para ordenar la matriz en orden descendente. ¿Qué hice mal?
Como se comenta en los Comentarios, su código viola los términos del contrato del Comparator . Según Jon Skeet , el Javadoc explica que "el implementador debe asegurarse de que sgn(compare(x, y)) == -sgn(compare(y, x)) para todo x e y".
Y, usted está trabajando demasiado duro.
Cuando desee invertir el orden, descendiendo en lugar de ascendiendo, simplemente llame a Comparator#reversed . Esta llamada devuelve un nuevo objeto Comparator para que lo use.
Dado que la clase Integer implementa Comparable , no necesita definir un comparador inicial. Simplemente llame a Comparator#reverseOrder . Esta llamada invierte el orden natural de los objetos.
List< Integer > myList = new ArrayList <> ( List.of( 7 , 1 , 42 ) ) ; myList.sort( Comparator.reverseOrder() );Vea este código ejecutado en vivo en IdeOne.com .
[7, 1, 42]
[42, 7, 1]
Su código falla porque no devolvió el valor "-1" y devolvió "0" no está en otra declaración. Entonces, cuando realiza la función ordenar (), siempre devuelve "0" para cada comparación.
Simplemente reescriba una declaración if y funciona bien.
Vea el ejemplo a continuación:
public static class Sort implements Comparator<Integer> { public int compare(Integer a, Integer b) { if (a < b) { return 1; } else if (a == b) { return 0; } else return -1; } }