/**
* Data items are compared to the same mimetype based off of three qualities:
* 1. Super primary
* 2. Primary
* 3. Times used
*/
private final Comparator<DataItem> mWithinMimeTypeDataItemComparator =
new Comparator<DataItem>() {
@Override
public int compare(DataItem lhs, DataItem rhs) {
if (!lhs.getMimeType().equals(rhs.getMimeType())) {
Log.wtf(TAG, "Comparing DataItems with different mimetypes lhs.getMimeType(): " +
lhs.getMimeType() + " rhs.getMimeType(): " + rhs.getMimeType());
return 0;
}
if (lhs.isSuperPrimary()) {
return -1;
} else if (rhs.isSuperPrimary()) {
return 1;
} else if (lhs.isPrimary() && !rhs.isPrimary()) {
return -1;
} else if (!lhs.isPrimary() && rhs.isPrimary()) {
return 1;
} else {
final int lhsTimesUsed =
lhs.getTimesUsed() == null ? 0 : lhs.getTimesUsed();
final int rhsTimesUsed =
rhs.getTimesUsed() == null ? 0 : rhs.getTimesUsed();
return rhsTimesUsed - lhsTimesUsed;
}
}
};
/**
* Sorts among different mimetypes based off:
* 1. Whether one of the mimetypes is the prioritized mimetype
* 2. Number of times used
* 3. Last time used
* 4. Statically defined
*/
private final Comparator<List<DataItem>> mAmongstMimeTypeDataItemComparator =
new Comparator<List<DataItem>> () {
@Override
public int compare(List<DataItem> lhsList, List<DataItem> rhsList) {
final DataItem lhs = lhsList.get(0);
final DataItem rhs = rhsList.get(0);
final String lhsMimeType = lhs.getMimeType();
final String rhsMimeType = rhs.getMimeType();
// 1. Whether one of the mimetypes is the prioritized mimetype
if (!TextUtils.isEmpty(mExtraPrioritizedMimeType) && !lhsMimeType.equals(rhsMimeType)) {
if (rhsMimeType.equals(mExtraPrioritizedMimeType)) {
return 1;
}
if (lhsMimeType.equals(mExtraPrioritizedMimeType)) {
return -1;
}
}
// 2. Number of times used
final int lhsTimesUsed = lhs.getTimesUsed() == null ? 0 : lhs.getTimesUsed();
final int rhsTimesUsed = rhs.getTimesUsed() == null ? 0 : rhs.getTimesUsed();
final int timesUsedDifference = rhsTimesUsed - lhsTimesUsed;
if (timesUsedDifference != 0) {
return timesUsedDifference;
}
// 3. Last time used
final long lhsLastTimeUsed =
lhs.getLastTimeUsed() == null ? 0 : lhs.getLastTimeUsed();
final long rhsLastTimeUsed =
rhs.getLastTimeUsed() == null ? 0 : rhs.getLastTimeUsed();
final long lastTimeUsedDifference = rhsLastTimeUsed - lhsLastTimeUsed;
if (lastTimeUsedDifference > 0) {
return 1;
} else if (lastTimeUsedDifference < 0) {
return -1;
}
// 4. Resort to a statically defined mimetype order.
if (!lhsMimeType.equals(rhsMimeType)) {
for (String mimeType : LEADING_MIMETYPES) {
if (lhsMimeType.equals(mimeType)) {
return -1;
} else if (rhsMimeType.equals(mimeType)) {
return 1;
}
}
}
return 0;
}
};
这两个比较器到底如何理解呢?
参考文章
http://muscle-liu.iteye.com/blog/157261
http://xkupc.top/java%E9%87%8C%E7%9A%84%E6%8E%92%E5%BA%8F-Comparator%EF%BC%88%E4%B8%80%EF%BC%89.html