2015-05-04 52 views
-2

我有一个ArrayList玩家属性为username类型的字符串和winratio类型为long,这只是一个比率gameswon/gamesplayed*100由多个属性对ArrayList排序

我想ArrayList通过username这是我使用Comparator类已经完成排序,但是我也想做出排序玩家基于winratio另一种方法,如果他们有平等winratio他们在自己的username方面订购。我不确定如何将两个比较器组合在一起,并给它们一个层次结构,以便知道哪种排序优先于另一排。

感谢

+0

您可以在单一的比较一举两得的事情。只需在单个compareTo方法' –

回答

3

计算差异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结果是0,它会不断尝试比较值在列表中的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())); 

这是未经测试,只是一个粗略的想法;)

-1

,如果他们有平等winratio下令他们在他们的用户名而言

这表明您应该使用用户名执行comparable(自然排序)。对于winRatio,使用comparator,并在winRatio相同的情况下 - 同时检查他们的用户名。

+0

@downvoter中添加这两个东西,就可以等待编辑完成,然后再进行宝贵的downvote。 –

0

你想可以用下面的代码来实现什么里面比较方法,

int compare(T o1, T o2){ 
    if(o1.winratio < o2.winratio){ 
     return -1; 
    }else if(o1.winratio < o2.winratio){ 
     return +1; 
    }else{ 
    return o1.userName.compareTo(o2.userName); 
    } 
} 

这应该工作,我会建议实施可比接口处理默认的排序情况下...