¿por qué mi método de comparación arrojar excepción – método de comparación viola su contrato general!
¿Por qué este código
public class SponsoredComparator implements Comparator<SRE> { public boolean equals(SRE arg0, SRE arg1){ return arg0.getSponsored()==arg1.getSponsored(); } public int compare(SRE object1, SRE object2) { Log.d("SponsoredComparator","object1.getName() == "+ object1.getName()); Log.d("SponsoredComparator","object1.getSponsored() == "+ object1.getSponsored()); Log.d("SponsoredComparator","object2.getName() == "+ object2.getName()); Log.d("SponsoredComparator","object2.getSponsored() == "+ object2.getSponsored()); Log.d("SponsoredComparator","compare return == "+ (object1.getSponsored() && object2.getSponsored() ? 0 : object1.getSponsored() ? -1 : 1)); return object1.getSponsored() && object2.getSponsored() ? 0 : object1.getSponsored() ? -1 : 1; } }
lanzar esta excepción: ERROR/AndroidRuntime(244): java.lang.IllegalArgumentException: Comparison method violates its general contract!
ERROR/AndroidRuntime(4446): at java.util.TimSort.mergeLo(TimSort.java:743)ERROR/AndroidRuntime(244): java.lang.IllegalArgumentException: Comparison method violates its general contract!
ERROR/AndroidRuntime(4446): at java.util.TimSort.mergeLo(TimSort.java:743)
- ¿Cómo entender que muestra LeakCanary?
- ¿Cómo detectar cuando la batería es baja: Android?
- Android Studio preDexDebug después de agregar jar archivo
- No destruir un servicio enlazado Activar destruir
- Cómo recurrir completamente a SortedList de RecyclerView
El método sre.getSponsored () devuelve un booleano.
Gracias.
- GestureDetector en libgdx
- ¿Puedo usar el servidor Jasig CAS para aplicaciones móviles android?
- Intent.setData vs Intent.putExtra
- Cómo probar el servicio remotel
- ¿Por qué el archivo de escritorio AES IO es incompatible con el archivo AES de Android?
- Configuración de ProGuard para Guava con obfuscación y optimización
- JSON Error "java.lang.IllegalStateException: Se esperaba BEGIN_OBJECT pero era STRING en la línea 1 de la columna 1 ruta $"
- ¿Cómo obtengo el nombre del método dentro de ese método?
Sospecho que el problema se produce cuando no se patrocina ningún valor. Eso volverá 1 como usted lo llame, es decir
x1.compare(x2) == 1 x2.compare(x1) == 1
Eso no es válido.
Le sugiero que cambie esto:
object1.getSponsored() && object2.getSponsored()
a
object1.getSponsored() == object2.getSponsored()
en ambos lugares. Probablemente extraería un método con esta firma en algún lugar:
public static int compare(boolean x, boolean y)
y luego lo llaman así:
public int compare(SRE object1, SRE object2) { return BooleanHelper.compare(object1.getSponsored(), object2.getSponsored()); }
Eso hará que el código sea más claro, IMO.
Supongo que está utilizando JDK 7. Compruebe la URL siguiente:
Desde http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#source
Área: API: Utilidades
Sinopsis: El comportamiento de ordenación actualizado de
Arrays
yCollections
puede arrojar unaIllegalArgumentException
Descripción: Se ha reemplazado el algoritmo de clasificación utilizado por
java.util.Arrays.sort
y (indirectamente) porjava.util.Collections.sort
. La nueva implementación de ordenación puede lanzar unaIllegalArgumentException
si detecta unComparable
que viola el contratoComparable
. La implementación anterior silenciosamente ignoró tal situación. Si se desea el comportamiento anterior, puede utilizar la nueva propiedad del sistema,java.util.Arrays.useLegacyMergeSort
, para restaurar el comportamiento anterior de mergesort.Naturaleza de la Incompatibilidad: conductual
RFE: 6804124
Para obtener información más detallada, consulte la referencia de la base de datos de errores aquí .
El contrato entre iguales () y compararTo () es que cuando equals () devuelve true, compareTo () devuelve 0 y cuando es igual () es false compareTo devuelve -1 o +1.
BTW: Supongo que su método compare () no se llama con mucha frecuencia ya que los mensajes de depuración utilizarán una cantidad significativa de CPU y memoria.
Estoy de acuerdo con todas las respuestas especialmente con jon, pero una addinal cosas que quiero decir que siempre debe comprobar la seguridad nula en comparar el método para que nuestro método nunca se romper y es un buen hábito en la programación para siempre nulo de control. Para más información, mira aquí
tal vez usted acaba de tener NaN valores que se comparan a través de Collections.sort … esto ha sido un problema para mí y tengo esa excepción, incluso teniendo la aplicación correcta de comparar (obj1, obj2) método! ¡Mira esto!
Tengo el mismo problema hoy en una aplicación web. Cuatro llamadas que trabajan en la misma matriz trataron de ordenar al mismo tiempo, con eficacia desorden el uno para el otro.
- Android – No se pudo encontrar google-play-services_lib.apk! error
- RecycleView que muestra sólo el primer elemento