Como en este ejemplo, https://www.duden.de/rechtschreibung/Regen_Niederschlag , las palabras se ordenan de la siguiente manera: "regelwidrig, Regelwidrigkeit, Regelzeit, regen, Regen, Regenabflussrohr, Regenanlage, regenarm, Regenbö, Regenbogen.. .", es decir, es una ordenación que "no distingue entre mayúsculas y minúsculas" de lo que hace automáticamente Collections.Sort(). Las palabras en minúsculas van antes de las mayúsculas como "regen, Regen".
ArrayList<String> regen = new ArrayList<String>( ); for(String x : new String[]{"regelwidrig", "Regelwidrigkeit", "Regelzeit", "regen", "Regen", "Regenabflussrohr", "Regenanlage", "regenarm", "Regenbö", "Regenbogen"}) { regen.add(x); }Respuesta de Collections.sort(regen):
[Regelwidrigkeit, Regelzeit, Regen, Regenabflussrohr, Regenanlage, Regenbogen, Regenbö,
regelwidrig, regen, regenarm]// lowercase at the end
Puedo implementar un comparador para esto, pero prefiero tomar una sola línea de código para obtener esta forma de clasificación. Tales como: Collections.SomeMethod(regen); o Collections.Sort(regen, some_extra_parameter); Pero no lo he encontrado después de una búsqueda profunda en Google, desafortunadamente.
Simplemente use un oneliner "Comparator.comparing"
List<String> regen = new ArrayList<String>( ); for(String x : new String[]{"regelwidrig", "Regelwidrigkeit", "Regelzeit", "regen", "Regen", "Regenabflussrohr", "Regenanlage", "regenarm", "Regenbö", "Regenbogen"}) { regen.add(x); } Collections.sort(regen, Comparator.comparing(s -> s.toLowerCase())); System.out.println(regen);El resultado será:
regelwidrig, Regelwidrigkeit, Regelzeit, regen, Regen, Regenabflussrohr, Regenanlage, regenarm, Regenbogen, Regenbö
Puede usar String.CASE_INSENSITIVE_ORDER para ordenar cadenas sin distinguir entre mayúsculas y minúsculas.
Si al mismo tiempo también desea especificar más el orden de los elementos que el comparador actual considera iguales (como lo haría String.CASE_INSENSITIVE_ORDER para "Regen" y "regen" ), entonces puede usar el método Comparator#thenComparing y pasarle Comparator que ordenaría esos elementos iguales como quieras.
"Regen", "regen" como "regen", "Regen" (minúsculas antes de mayúsculas), simplemente puede invertir su orden natural con Comparator.reverseOrder() .Entonces su código puede verse así:
regen.sort(String.CASE_INSENSITIVE_ORDER.thenComparing(Comparator.reverseOrder()));Manifestación:
ArrayList<String> regen = new ArrayList<String>( Arrays.asList("regelwidrig", "Regelwidrigkeit", "Regelzeit", "Regen", "regen", "Regenabflussrohr", "Regenanlage", "regenarm", "Regenbö", "Regenbogen") ); regen.sort(String.CASE_INSENSITIVE_ORDER.thenComparing(Comparator.reverseOrder())); System.out.println(regen); Resultado: [regelwidrig, Regelwidrigkeit, Regelzeit, regen, Regen, Regenabflussrohr, Regenanlage, regenarm, Regenbogen, Regenbö]
(Aviso "Regen" , "regen" ware intercambiado)
La razón por la que las cadenas se ordenan de forma natural es que los valores ASCII de estos caracteres tienen un valor más bajo para MAYÚSCULAS que para minúsculas . En este caso, todas las palabras comienzan con "R" y el valor ASCII de la "R" mayúscula es 82 (52 hex), mientras que la "R" minúscula es 114 (72 hex). Por esa razón, Regen precederá a regen al ordenar en orden natural (en Java).
Entonces, usando Java simple
public static void main(String[] args) { List<String> words = Arrays.asList(new String[]{"regelwidrig", "Regelwidrigkeit", "Regelzeit", "regen", "Regen", "Regenabflussrohr", "Regenanlage", "regenarm", "Regenbö", "Regenbogen"}); Collections.sort(words); System.out.println(words); }Saldrá
[Regelwidrigkeit, Regelzeit, Regen, Regenabflussrohr, Regenanlage, Regenbogen, Regenbö, regelwidrig, regen, regenarm]Como puede ver, todas las palabras comienzan con "R", pero la ordenación coloca todas las palabras en mayúscula antes que las que comienzan con minúsculas.
Como @Pshemo indicó en su respuesta, puede (debe) codificar su cuenta de comparación para distinguir entre mayúsculas y minúsculas e invertir el orden de minúsculas frente a mayúsculas según sea necesario.
Utilice la clase Collator para la comparación de String sensibles a la configuración regional.
Específicamente, Java tiene soporte para recopiladores alemanes:
Collator collator = Collator.getInstance(Locale.GERMAN); regen.sort(collator);Ejemplo:
List<String> inputs = new ArrayList <>( List.of( "regelwidrig", "Java", "Regelwidrigkeit", "Regelzeit", "regen", "Regen", "Regenabflussrohr", "Regenanlage", "regenarm", "Regenbö", "Regenbogen" ) ); inputs.sort( java.text.Collator.getInstance( Locale.GERMAN ) ) ;[Java, regelwidrig, Regelwidrigkeit, Regelzeit, regen, Regen, Regenabflussrohr, Regenanlage, regenarm, Regenbö, Regenbogen]