package cn.mutils.core.sort.comparator;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cn.mutils.core.IClearable;
import cn.mutils.core.sort.Order;
import cn.mutils.core.sort.OrderItem;
/**
* Comparator for presorted list
*
* @param <E>
*/
@SuppressWarnings("UnnecessaryUnboxing")
public class PreSortedComparator<E> extends OrderItem implements Comparator<E>, IClearable {
protected List<?> mPreSorted;
protected Map<E, Integer> mPreSortedMap;
public List<?> getPreSorted() {
return mPreSorted;
}
public void setPreSorted(List<?> preSorted) {
mPreSorted = preSorted;
if (mPreSortedMap == null) {
mPreSortedMap = new HashMap<E, Integer>();
}
}
@Override
public int compare(E lhs, E rhs) {
int diff = getPreSortedIndexOf(lhs) - getPreSortedIndexOf(rhs);
if (diff > 0) {
return mOrder == Order.ASC ? 1 : -1;
} else if (diff < 0) {
return mOrder == Order.ASC ? -1 : 1;
} else {
return 0;
}
}
/**
* Get index of e in presorted list
*/
protected int getPreSortedIndexOf(E e) {
int index = -1;
Integer indexInteger = mPreSortedMap.get(e);
if (indexInteger == null) {
index = mPreSorted.indexOf(e);
mPreSortedMap.put(e, index);
} else {
index = indexInteger.intValue();
}
return index;
}
@Override
public void clear() {
if (mPreSortedMap != null) {
mPreSortedMap.clear();
mPreSortedMap = null;
}
mPreSorted = null;
}
}