当前位置: 首页 > 知识库问答 >
问题:

检索按值排序的映射中某个条目周围固定数量的条目

通迪
2023-03-14

波乔即是。java表示排行榜中的一个条目。Position是排行榜中的位置,1是得分最高的用户

public class Entry {

    private String uid;
    private int score;
    private int position;

@Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + score;
        result = prime * result + ((uid == null) ? 0 : uid.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;

        if (!(obj instanceof Entry))
            return false;

        Entry other = (Entry) obj;
        if (score != other.score)
            return false;
        if (uid == null) {
            if (other.uid != null)
                return false;
        } else if (!uid.equals(other.uid))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Entry [uid=" + uid + ", score=" + score + ", position=" + position + "]";
    }
}
public class GameDefault {

Map<String, Entry> leaderBoardUserEntryMap;

public void submitScore(String uid, int score) {

        Entry newEntry = new Entry(uid, score);
        leaderBoardUserEntryMap.put(uid, newEntry);
    }

public List<Entry> getLeaderBoard(String uid) {

    /* Option-3 : A Map of uid-Entry */
    leaderBoardUserEntryMap.entrySet().stream().sorted(Map.Entry.comparingByValue(Comparator.comparing(Entry::getScore, Integer::compare).reversed()))
                .filter(/*What to put here*/);

        return null;
    }
}

.

我不知道该用什么谓词来返回5个条目,包括正在搜索的条目。另一个方面是性能,因为排行榜可以有几十万个条目。

*********编辑-1***********

List<GameEntry> selectedEntries =  leaderBoardUserEntryMap.entrySet().stream()
            .sorted(Map.Entry.comparingByValue(Comparator.comparing(GameEntry::getScore, Integer::compare)
                    .reversed())).map(Map.Entry::getValue).collect(Collectors.toList());

int indexOfnewEntry = selectedEntries.indexOf(leaderBoardUserEntryMap.get(uid));
return  selectedEntries.subList(indexOfnewEntry-2,indexOfnewEntry+2);

使用parallelStream()会导致问题吗?

列表条目=LeaderBoardUserEntryMap.EntrySet().ParallelStream().Sorted(Map.Entry.ComparingByValue(Comparator.Comparating(Entry::GetScore,Integer::Comparate).Reverded()).Parallel().map(map.Entry::GetValue).Collect(Collectors.ToList());

共有1个答案

咸疏珂
2023-03-14

stream#limit将帮助您限制在已创建的反向列表中查找最前面的n(5)个用户,此外,您还可以使用这些值映射列表,并从中收集list 最终为:

return leaderBoardUserEntryMap.entrySet().stream()
            .sorted(Map.Entry.comparingByValue(Comparator.comparing(Entry::getScore, Integer::compare).reversed()))
            .limit(5).map(Map.Entry::getValue).collect(Collectors.toList());

编辑:感谢@yogesh提供的用例

假设有100个用户,而正在搜索的用户是93。列表应返回91、92、93、94、95。此解将返回1,2,3,4,5

List<GameEntry> selectedEntries =  leaderBoardUserEntryMap.entrySet().stream()
            .sorted(Map.Entry.comparingByValue(Comparator.comparing(GameEntry::getScore, Integer::compare)
                    .reversed())).map(Map.Entry::getValue).collect(Collectors.toList());

int indexOfnewEntry = selectedEntries.indexOf(leaderBoardUserEntryMap.get(uid));
return  selectedEntries.subList(indexOfnewEntry-2,indexOfnewEntry+2);

编辑2:

indexOfnewEntry和+-2可能导致IndexOutOfBoundsException,防范它似乎有点乏味,这里有什么最佳方法吗?

因为条目的索引可能会随分数而变化,而子列表访问还取决于它之前/之后所需的输出数量。守卫是比其他任何方法更好的选择。另外,可以考虑的是一个customSubList实现,它可以在内部检查您的集合类型。如何使用subList()解释了这个问题。不过我特别喜欢这个:

dataList.subList(Math.max(0, first), Math.min(dataList.size(), last) );

除非执行了任何synchronized块,这些块可能会对流进行更改和并发更新,否则不会导致任何问题。

但是你应该知道什么时候使用并行流--我应该总是在可能的时候使用一个并行流吗?

 类似资料:
  • Position是排行榜中的位置,1是得分最高的用户 GameBoard类有两个方法: submitScore(String uid,int score)每个玩家调用这个方法将他的分数提交到游戏板上。每个玩家/用户只有一个条目,因此,如果玩家多次调用此方法,则存储其最新得分 GetLeaderBoard(字符串uid) 上述代码的问题: 何时(理想情况下,在submitScore()期间)以及如何

  • 我在Firebase实时数据库中使用Unity创建了一个简单的排行榜: 键对应于用户名,值对应于用户分数。 我想 检索前20条记录 按分数排序时,检索给定用户名周围的5条记录(上面2条,本身和下面2条)。 我通过以下查询检索到前100名的分数: 我使用LimitToLast是因为排序是按升序进行的。 结果看起来像: 然后对于第二个任务,我想检索用户名周围的分数,比如“test100”。我想检索这样

  • 这是对这个问题的跟进。我有一个如下的查询: 当我这样做时,我会为用户获取不同的值,并且它们按asc顺序按角色\u id排序,此查询的唯一问题是具有两个或更多角色的用户位于仅具有一个角色的用户的后面。例如,用户有和的角色,而其他用户只有一个的角色,该用户将在列表中有两个角色的用户之前。我想改变这一点,让拥有更多角色的用户超过只有一个角色的用户。

  • 本文向大家介绍使用JavaScript按顺序检索对象的条目?,包括了使用JavaScript按顺序检索对象的条目?的使用技巧和注意事项,需要的朋友参考一下 假设以下是我们的对象- 使用方法按顺序检索对象的条目- 示例 要运行以上程序,您需要使用以下命令- 输出结果 在这里,我的文件名为demo146.js。这将产生以下输出-

  • 问题内容: 我正在尝试做一个标准查询,该查询返回像常见问题一样的stackoverflow中回答最多的问题。 一个问题包含多个答案。 我试图以标准查询返回按每个问题的答案数排序的最常回答的问题。 有人知道我应该在hibernate标准util中使用什么吗? 问题答案: 这将返回一个Object []列表。每个Object []都将问题的ID作为第一个元素,并将此问题的答案数目作为第二个元素。问题按

  • 我的问题是如何根据值和键对内容进行排序,并得到一个? 首先,条目需要按值降序排序,如果值发生冲突,也要按键降序排序。 给定的示例: 预期订单: