计算winRatio的差异,如果是0,返回名称的差异,例如...
public class MultiComparator implements Comparator<Player> {
@Override
public int compare(Player o1, Player o2) {
int result = (int) (o1.getWinRatio() - o2.getWinRatio());
if (result == 0) {
result = o1.getUserName().compareTo(o2.getUserName());
}
return result;
}
}
因为我无事可做,所以我用了这个
public interface Player {
public String getUserName();
public long getWinRatio();
}
作为基础对象
另一个(奇怪的)想法可能是创建一个“链接的”Comparator,允许您将两个(或更多)Comparator 链接在一起,这样任何一个Comparator 的结果都是@ 987654328@,它将继续尝试将值与列表中的Comparator 进行比较...
public class RatioComparator implements Comparator<Player> {
@Override
public int compare(Player o1, Player o2) {
return (int) (o1.getWinRatio() - o2.getWinRatio());
}
}
public class NameComparator implements Comparator<Player> {
@Override
public int compare(Player o1, Player o2) {
return o1.getUserName().compareTo(o2.getUserName());
}
}
public class ChainedComparator implements Comparator<Player> {
private Comparator<Player>[] comparators;
public ChainedComparator(Comparator<Player>... comparators) {
this.comparators = comparators;
}
@Override
public int compare(Player o1, Player o2) {
int result = -1;
for (Comparator<Player> proxy : comparators) {
result = proxy.compare(o1, o2);
if (result != 0) {
break;
}
}
return result;
}
}
你可以使用类似...
Collections.sort(list, new ChainedComparator(new RatioComparator(), new NameComparator()));
这是未经测试的,只是一个粗略的想法;)