All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.intelie.pipes.util.PipesComparator Maven / Gradle / Ivy

There is a newer version: 0.25.5
Show newest version
package net.intelie.pipes.util;

import java.lang.reflect.Array;
import java.util.Comparator;

public class PipesComparator implements Comparator {
    private static final PipesComparator instance = new PipesComparator(false);
    private final boolean allowsArrays;

    public static PipesComparator instance() {
        return instance;
    }

    public PipesComparator(boolean allowsArrays) {
        this.allowsArrays = allowsArrays;
    }

    @Override
    public int compare(Object c1, Object c2) {
        if (c1 == null || c2 == null)
            return Boolean.compare(c1 != null, c2 != null);

        if (allowsArrays) {
            if (c1 instanceof Object[] && c2 instanceof Object[]) {
                int len1 = Array.getLength(c1);
                int len2 = Array.getLength(c2);
                for (int i = 0; i < Math.min(len1, len2); i++) {
                    int res = compare(Array.get(c1, i), Array.get(c2, i));
                    if (res != 0) return res;
                }
                return Integer.compare(len1, len2);
            }
        }

        Class class1 = c1.getClass();
        Class class2 = c2.getClass();

        if (class1 == class2 && c1 instanceof Comparable && c2 instanceof Comparable)
            return ((Comparable) c1).compareTo(c2);

        boolean number1 = c1 instanceof Number;
        boolean number2 = c2 instanceof Number;

        if (number1 && number2)
            return Double.compare(((Number) c1).doubleValue(), ((Number) c2).doubleValue());
        return Integer.compare(
                number1 ? Number.class.hashCode() : class1.hashCode(),
                number2 ? Number.class.hashCode() : class2.hashCode());
    }

}