我在排序列表时遇到奇怪的问题。
首先,我有一个自定义类
private List<Player> players;
因此,玩家中有一些项目,例如 2 - “玩家 1”和“玩家 2”。
它基本上是 Player 类:
public class Player {
private String name;
private int points = 0;
}
我有一个用于对玩家进行排序(比较点)的函数:
public String getActualRanking() {
for(int z = 0; z < players.size(); z++) {
Log.d("COLSORT", players.get(z).getName());
}
String message = "";
List<Player> temp = players;
Collections.sort(temp, new Comparator<Player>() {
@Override
public int compare(Player player, Player t1) {
return Integer.valueOf(t1.getPoints()).compareTo(player.getPoints());
}
});
for(int i = 0; i < temp.size(); i++) {
message += Integer.toString(temp.get(i).getPoints()) + " pkt - " + temp.get(i).getName() + "\n";
}
for(int z = 0; z < players.size(); z++) {
Log.d("COLSORT", players.get(z).getName());
}
return message;
}
为什么有2个Log.d?因为第一个日志是:
D/COLSORT﹕ Player 1
D/COLSORT﹕ Player 2
但第二是:
D/COLSORT﹕ Player 2
D/COLSORT﹕ Player 1
问题是:为什么?如果我创建了要排序的“临时”列表并且此函数中不再使用“玩家”,为什么 Collections.sort 对“玩家”列表进行排序?我真的不明白这种行为:/
最佳答案
List<Player> temp = players;
这不会创建玩家
列表的副本。 temp
和 players
现在引用相同列表。 temp
和 players
之间不再有任何区别。
如果您想制作一个副本,以便可以在不更改players
的情况下对temp
进行排序,请编写
List<Player> temp = new ArrayList<>(players);
关于java - 集合的奇怪行为 - 排序方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34006904/