根据单独表中的统计信息对用户列表进行排序

时间:2017-03-30 10:47:11

标签: java sorting arraylist logic objectify

我有一张朋友桌,我可以 min_dx = rect2.left - rect1.right min_dy = rect2.top - rect.bottom if both values > 0 (++ case) min_dist = sqrt(min_dx^2 + min_dy^2) //corner-corner case +- case min_dist = min_dx -+ case min_dist = min_dy -- case min_dist = 0 。我还有一张统计信息表,其中userIdsKey

我想创建一个按统计表中userId排序的朋友的高分(List),这个列表排序的最佳方式是什么?

我可以填写像这样的朋友数据:

score

现在我想对其进行排序并返回按最高分排序的朋友列表(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

2 个答案:

答案 0 :(得分:2)

如果您对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;
    }
}

答案 1 :(得分:1)

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

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

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

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