【发布时间】:2018-08-09 12:14:38
【问题描述】:
我正在按排名顺序对我游戏中的玩家进行排序,因此,首先是管理员,然后是版主,一直到玩家。这是我的那部分代码:
/*
* 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,然后是数组上的共同所有者名称,并检查他们是否在线。如果是这样,它会检查排序列表中的名字是否不是所有者。然后它运行一个循环来检查列表中的所有者在哪里并替换两个玩家,以便所有者在列表的顶部。我希望这不会令人困惑。
我的方法好吗?如果没有,有什么建议吗?游戏可能有数千名玩家在玩,所以速度和性能都被考虑在内。
【问题讨论】:
-
为什么不用
Collections来存储播放器,用Comparator接口定义排序更简单? -
Collections.sort()或Arrays.sort()不适合您的Comparator吗?这样您就可以将排序算法与比较逻辑(即如何确定顺序)分开。 -
旁注:您可以使用
xxx.equalsIgnoreCase(yyy)代替xxx.toLowerCase().equals(yyy.toLowerCase())- 更短且更具可读性 -
其实我还不知道收藏。我对编程很陌生,没有遇到收藏。我会去研究他们,谢谢你的信息。另外,如果您能就我当前的问题给我一个示例代码,我将不胜感激并很高兴。谢谢!!
-
你用 'i' 变量进行了两次比较是否正常:
if (!sortedPlayers.get(place).getUsername().toLowerCase().equals(Settings.MAIN_ACESSS[i].toLowerCase())) {
标签: java performance sorting