根据来自单独 Table 的统计数据对用户列表进行排序
Sort a List of users based on statistics from a seperate Table
我有 table 个朋友,我可以在那里找到 userIds
。我还有一个 table 的 Stats,其中 Key
是 userId
。
我想创建一个按统计信息中的 score
排序的朋友的高分 (List
)-table,排序此列表的最佳方法是什么?
我可以像这样填写朋友统计数据数组:
List<Player> friendsList = getFriends(playerID, limit);
List<Stats> stats = new ArrayList<Stats>();
for(Player player: friendsList){
stats.add(ofy().load().type(Stats.class).filter("player", player).first().now());
}
现在我想对它进行排序,return 朋友列表 (Player
) + score
按最高分排序。
第一步是排序stats
。在我看来,最简单的可能性是:
让 Stats
实现 Comparable
并调用 Collections.sort(stats);
创建一个新的比较器并调用Collections.sort(stats, new StatsComparator());
现在您可以遍历此列表,通过其 ID 获取 Player
并将其放入新列表。
如果您对 friendsList 使用 HashMap 或使用 SQL 进行排序,可以使解决方案更加优雅。但我决定根据你提供的信息来回答,这样你就不必重构太多。我可以为您提供更优雅的解决方案,如果您需要,请提出。
解决你的问题
class Main{
public static void main(String[] args) {
List<Player> friendsList = new ArrayList<Player>();
friendsList.add(new Player(1));
friendsList.add(new Player(2));
friendsList.add(new Player(3));
List<Stats> stats = new ArrayList<Stats>();
stats.add(new Stats(1,100));
stats.add(new Stats(2, 300));
stats.add(new Stats(3,200));
Collections.sort(stats,
(Stats s1, Stats s2)->s1.getScore().compareTo(s2.getScore())
);
List<Player> highscore = new ArrayList<Player>();
for(Stats s : stats){
for(int i = 0; i < stats.size(); i++){
if(friendsList.get(i).id == s.getUserId()){
highscore.add(friendsList.get(i));
}
}
}
Collections.reverse(highscore);
for(Player p : highscore){
System.out.println(p.getId());
}
}
}
输出:
2
3
1
额外类 用于测试:
class Player{
Integer id;
Player(Integer id){
this.id = id;
}
Integer getId(){
return id;
}
}
class Stats{
Integer userId;
Integer score;
Stats(Integer userId, Integer score){
this.userId = userId;
this.score = score;
}
Integer getScore(){
return score;
}
Integer getUserId(){
return userId;
}
}
我有 table 个朋友,我可以在那里找到 userIds
。我还有一个 table 的 Stats,其中 Key
是 userId
。
我想创建一个按统计信息中的 score
排序的朋友的高分 (List
)-table,排序此列表的最佳方法是什么?
我可以像这样填写朋友统计数据数组:
List<Player> friendsList = getFriends(playerID, limit);
List<Stats> stats = new ArrayList<Stats>();
for(Player player: friendsList){
stats.add(ofy().load().type(Stats.class).filter("player", player).first().now());
}
现在我想对它进行排序,return 朋友列表 (Player
) + score
按最高分排序。
第一步是排序stats
。在我看来,最简单的可能性是:
让
Stats
实现Comparable
并调用Collections.sort(stats);
创建一个新的比较器并调用
Collections.sort(stats, new StatsComparator());
现在您可以遍历此列表,通过其 ID 获取 Player
并将其放入新列表。
如果您对 friendsList 使用 HashMap 或使用 SQL 进行排序,可以使解决方案更加优雅。但我决定根据你提供的信息来回答,这样你就不必重构太多。我可以为您提供更优雅的解决方案,如果您需要,请提出。
解决你的问题
class Main{
public static void main(String[] args) {
List<Player> friendsList = new ArrayList<Player>();
friendsList.add(new Player(1));
friendsList.add(new Player(2));
friendsList.add(new Player(3));
List<Stats> stats = new ArrayList<Stats>();
stats.add(new Stats(1,100));
stats.add(new Stats(2, 300));
stats.add(new Stats(3,200));
Collections.sort(stats,
(Stats s1, Stats s2)->s1.getScore().compareTo(s2.getScore())
);
List<Player> highscore = new ArrayList<Player>();
for(Stats s : stats){
for(int i = 0; i < stats.size(); i++){
if(friendsList.get(i).id == s.getUserId()){
highscore.add(friendsList.get(i));
}
}
}
Collections.reverse(highscore);
for(Player p : highscore){
System.out.println(p.getId());
}
}
}
输出:
2
3
1
额外类 用于测试:
class Player{
Integer id;
Player(Integer id){
this.id = id;
}
Integer getId(){
return id;
}
}
class Stats{
Integer userId;
Integer score;
Stats(Integer userId, Integer score){
this.userId = userId;
this.score = score;
}
Integer getScore(){
return score;
}
Integer getUserId(){
return userId;
}
}