java - 排序 - 速度和性能

标签 java performance sorting

我按照排名顺序对游戏中的玩家进行排序,首先是管理员,然后是主持人,一直到玩家。这是我该部分的代码:

/*
     * 2 -> Administrator, 1 -> Moderator, 6 -> Supporter, 14 -> Dicer, 8 -> Ultra
     * Donator, 13 -> Extreeme Donator, 9 -> Donator
     */

    Integer[] sortedRanksRights = { 2, 1, 6, 14, 8, 13, 9, 0 };
    ArrayList<Player> sortedPlayers = new ArrayList<Player>();

    // Loop over and add the sorted players to the list according to ranks
    for (int i = 0; i < sortedRanksRights.length; i++) {
        for (Player pp : World.getPlayers()) {
            if (pp.getRights() != sortedRanksRights[i])
                continue;
            else
                sortedPlayers.add(pp);
        }
    }

效果很好!! 但后来我想到了对管理员进行排序的想法 所有者、共同所有者,然后是其他管理员。这是我的第二部分的代码:

    if (sortedPlayers.size() > 1) {
        int place = 0;
        for (int i = 0; i < Settings.MAIN_ACESSS.length; i++) {
            if (World.getPlayerByDisplayName(Settings.MAIN_ACESSS[i]) != null) {
                if (!sortedPlayers.get(place).getUsername().toLowerCase()
                        .equals(Settings.MAIN_ACESSS[i].toLowerCase())) {
                    for (int j = 0; j < sortedPlayers.size(); j++) {
                        if (!sortedPlayers.get(place).getUsername().toLowerCase()
                                .equals(Settings.MAIN_ACESSS[i].toLowerCase())) {
                            Player target = sortedPlayers.get(place);
                            Player mine = sortedPlayers.get(j);
                            sortedPlayers.set(place, mine);
                            sortedPlayers.set(j, target);
                            place++;
                            break;
                        }
                    }
                } else {
                    place++;
                }
            }
        }
    }

main_access 具有所有者和共同所有者名称。

这也有效,但我不认为这是实现这种目标的最佳方法。看看我写的代码让我很困惑啊哈哈。那么让我解释一下。

这会检查是否有超过 1 名玩家在玩游戏进行排序,然后运行一个循环到具有所有者的 main_access,然后是数组上的共同所有者名称,并检查他们是否在线。如果是,它会检查排序列表中的第一个名字是否不是所有者。然后,它运行一个循环来检查所有者在列表中的位置,并替换两个玩家,以便所有者位于列表顶部。我希望这不会造成困惑。

我的方法好吗?如果没有,有什么建议吗?该游戏可能有数千名玩家玩,因此要考虑速度和性能。

最佳答案

如果排序类别的括号是静态的并且永远不会改变。您可以使用bucket sort这会给你 O(n)。

想法是将对象排列在不同的桶中(在您的例子中是两层桶),并以固定的方式遍历桶。

例如:

对于输入:

player1: Moderator
player2: admin
player3: Donator
player4: Dicer

你需要遍历并将其组织成这样的东西,

Admin: [player2]
Moderator: [player1]
Donator: [player3]
Dicer: [player4]

现在您只需要按固定顺序迭代这些存储桶并读出其中的玩家即可。

关于java - 排序 - 速度和性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51766759/

相关文章:

java - 从java中的字符串获取 float 或整数值

java - Android - 向库存相机添加按钮

java - Oracle 表就像一个队列

java - 对大 vector 进行排序的快速方法

java - 如何编写一个java程序来过滤所有注释行并只打印java代码行?

java - 为什么这段代码不起作用? HTTP 状态 404 – 在 jsp 和 servlet 上未找到

performance - Actionscript 3 中循环的变量声明性能

python - postgresql 中的动态数据

sorting - 在Elasticsearch中对日期字段进行排序时如何指定 "precision"?

java - 如何排序忽略大写的数组?