Cannot compare user-defined objects for sorting (Java 8)

Priyansu Singh

I have following classes-

public class Pair
{
    public double value;
    int id;

    Pair(){
        value=0;
        id=0;
    }
    Pair(double value, int id){
        this.value=value;
        this.id=id;
    }
}

PairComparator class to be used for implementing Comparator class

public class PairComparator implements Comparator<Pair>{
    @Override
    public int compare(Pair p1, Pair p2){
        return (int)(p2.value-p1.value);
    }
}

I'm trying to sort a Pair collection as follows-

List<Pair> list= new ArrayList<Pair>();
list.add(new Pair(5.2, 4));
list.add(new Pair(3.4, 5));
list.add(new Pair(10.3, 3));

Collections.sort(list, new PairComparator());

However I'm getting following error-

`Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:895)
at java.util.TimSort.mergeAt(TimSort.java:512)
at java.util.TimSort.mergeCollapse(TimSort.java:435)
at java.util.TimSort.sort(TimSort.java:241)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at com.research.priyanshuid.recommendation_system.MatrixRecalculation.main(MatrixRecalculation.java:59)
Vinay Rao

You usually get this error when the comparator violates the transitivity - check this answer.

When using double in a Comparator, you should avoid using the substraction logic. Since you're converting the result into an int, it would be rounded and thus would break transitivity while comparing values like 5.1, 5.2 etc. Check this answer for details.

You're better off using a comparator logic as so:

public int compare(Pair p1, Pair p2) {
   if (p1.value < p2.value) return -1;
   if (p1.value > p2.value) return 1;
   return 0;
}

As mentioned by sarilks - if you're expecting NaN values better use in-built compare function -

public int compare(Pair p1, Pair p2){
    return Double.compare(p1.value, p2.value);
}

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Cannot compare user-defined objects for sorting (Java 8)

From Dev

java User Defined Classes and Objects

From Dev

Sorting C++ Arrays of user-defined objects using Pointers?

From Dev

Sorting of User Defined Vector

From Dev

User-defined class objects in Java TreeMap

From Dev

Comparable and overriding compare method for sorting an array lists of objects in java

From Dev

Sorting user defined array by string using selection sort in java

From Dev

Sorting a std::vector of std::pair's using user defined compare class

From Dev

How to declare an unknown sized array of user defined objects in java script

From Dev

HashMap fails for user defined objects?

From Dev

Sorting the User input in Java

From Dev

Java: Compare objects using >, < and ==

From Dev

Sorting user defined structure in C++

From Dev

Sorting an array via user defined function

From Dev

User defined packages in Java

From Dev

Java program to alphanumeric sorting objects

From Dev

Java TreeSet sorting objects by value

From Dev

Sorting a set of objects by a user's preference

From Dev

Java objects compare with null cases?

From Dev

Compare two objects with "<" or ">" operators in Java

From Dev

Compare and order objects in an arraylist, java

From Dev

compare two Integer objects with == in java

From Dev

Java: How to compare Dimension objects

From Dev

Compare 2 List of objects java

From Dev

Java array of objects with defined keys

From Dev

The relationship between the two objects cannot be defined

From Dev

Returning user defined objects using dependency injection

From Dev

C++ atomic for pointers to user defined objects

From Dev

User Defined Runtime Attributes and Associated Objects

Related Related

HotTag

Archive