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

com.github.xphsc.bean.comparator.ComparatorChain Maven / Gradle / Ivy

There is a newer version: 1.2.3
Show newest version
package com.github.xphsc.bean.comparator;

import java.io.Serializable;
import java.util.*;

/**
 * Created by ${huipei.x} on 2017-8-7.
 */
public class ComparatorChain implements Comparator, Serializable {
    private static final long serialVersionUID = -721644942746081630L;
    private final List> comparatorChain;
    private BitSet orderingBits;
    private boolean isLocked;

    public ComparatorChain() {
        this(new ArrayList(), new BitSet());
    }

    public ComparatorChain(Comparator comparator) {
        this(comparator, false);
    }

    public ComparatorChain(Comparator comparator, boolean reverse) {
        this.orderingBits = null;
        this.isLocked = false;
        this.comparatorChain = new ArrayList(1);
        this.comparatorChain.add(comparator);
        this.orderingBits = new BitSet(1);
        if(reverse) {
            this.orderingBits.set(0);
        }

    }

    public ComparatorChain(List> list) {
        this(list, new BitSet(list.size()));
    }

    public ComparatorChain(List> list, BitSet bits) {
        this.orderingBits = null;
        this.isLocked = false;
        this.comparatorChain = list;
        this.orderingBits = bits;
    }

    public void addComparator(Comparator comparator) {
        this.addComparator(comparator, false);
    }

    public void addComparator(Comparator comparator, boolean reverse) {
        this.checkLocked();
        this.comparatorChain.add(comparator);
        if(reverse) {
            this.orderingBits.set(this.comparatorChain.size() - 1);
        }

    }

    public void setComparator(int index, Comparator comparator) throws IndexOutOfBoundsException {
        this.setComparator(index, comparator, false);
    }

    public void setComparator(int index, Comparator comparator, boolean reverse) {
        this.checkLocked();
        this.comparatorChain.set(index, comparator);
        if(reverse) {
            this.orderingBits.set(index);
        } else {
            this.orderingBits.clear(index);
        }

    }

    public void setForwardSort(int index) {
        this.checkLocked();
        this.orderingBits.clear(index);
    }

    public void setReverseSort(int index) {
        this.checkLocked();
        this.orderingBits.set(index);
    }

    public int size() {
        return this.comparatorChain.size();
    }

    public boolean isLocked() {
        return this.isLocked;
    }

    private void checkLocked() {
        if(this.isLocked) {
            throw new UnsupportedOperationException("Comparator ordering cannot be changed after the first comparison is performed");
        }
    }

    private void checkChainIntegrity() {
        if(this.comparatorChain.size() == 0) {
            throw new UnsupportedOperationException("ComparatorChains must contain at least one Comparator");
        }
    }

    public int compare(E o1, E o2) throws UnsupportedOperationException {
        if(!this.isLocked) {
            this.checkChainIntegrity();
            this.isLocked = true;
        }

        Iterator comparators = this.comparatorChain.iterator();

        for(int comparatorIndex = 0; comparators.hasNext(); ++comparatorIndex) {
            Comparator comparator = (Comparator)comparators.next();
            int retval = comparator.compare(o1, o2);
            if(retval != 0) {
                if(this.orderingBits.get(comparatorIndex)) {
                    if(retval > 0) {
                        retval = -1;
                    } else {
                        retval = 1;
                    }
                }

                return retval;
            }
        }

        return 0;
    }

    public int hashCode() {
        int hash = 0;
        if(null != this.comparatorChain) {
            hash ^= this.comparatorChain.hashCode();
        }

        if(null != this.orderingBits) {
            hash ^= this.orderingBits.hashCode();
        }

        return hash;
    }

    public boolean equals(Object object) {
        if(this == object) {
            return true;
        } else if(null == object) {
            return false;
        } else if(!object.getClass().equals(this.getClass())) {
            return false;
        } else {
            boolean var10000;
            label48: {
                label32: {
                    ComparatorChain chain = (ComparatorChain)object;
                    if(null == this.orderingBits) {
                        if(null != chain.orderingBits) {
                            break label32;
                        }
                    } else if(!this.orderingBits.equals(chain.orderingBits)) {
                        break label32;
                    }

                    if(null == this.comparatorChain) {
                        if(null == chain.comparatorChain) {
                            break label48;
                        }
                    } else if(this.comparatorChain.equals(chain.comparatorChain)) {
                        break label48;
                    }
                }

                var10000 = false;
                return var10000;
            }

            var10000 = true;
            return var10000;
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy