【问题标题】:Sort a List of users based on statistics from a seperate Table根据单独表中的统计数据对用户列表进行排序
【发布时间】:2017-03-30 10:47:11
【问题描述】:

我有一张朋友桌,我可以在其中获得userIds。我还有一个统计表,其中KeyuserId

我想在统计表中创建一个按score 排序的朋友的高分 (List),对这个列表进行排序的最佳方法是什么?

我可以像这样填充好友统计数据数组:

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());
        }

现在我想对其进行排序并返回按最高分排序的朋友列表 (Player) + score

【问题讨论】:

  • stats 已经排序了吗?
  • @StefanWarminski 不是
  • 我添加了一个使用您在帖子中提供的详细信息的解决方案。我已经测试了该解决方案,它可以正确编译。这不是一个优雅的解决方案。如果您愿意,我可以为您提供详细而优雅的解决方案。

标签: java sorting arraylist logic objectify


【解决方案1】:

如果您为好友列表使用 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;
    }
}

【讨论】:

  • 不确定你是如何将 compareTo() 与整数一起使用的。
  • Collections.sort(stats, s1, Stats s2)-&gt;s1.getScore().compareTo(s2.getScore())); 正在使用 lambda 表达式对整数进行排序。我只是觉得这比实现比较器更容易?
【解决方案2】:

第一步是对stats进行排序。在我看来,最简单的可能性是:

  1. Stats实现Comparable并调用Collections.sort(stats);

  2. 创建一个新的比较器并调用Collections.sort(stats, new StatsComparator());

现在您可以遍历此列表,通过其 ID 获取 Player 并将其放入新列表中。

【讨论】:

    猜你喜欢
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    相关资源
    最近更新 更多