java - 集合的奇怪行为 - 排序方法

标签 java android sorting collections

我在排序列表时遇到奇怪的问题。

首先,我有一个自定义类

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;

这不会创建玩家列表的副本。 tempplayers 现在引用相同列表。 tempplayers 之间不再有任何区别。

如果您想制作一个副本,以便可以在不更改players的情况下对temp进行排序,请编写

List<Player> temp = new ArrayList<>(players);

关于java - 集合的奇怪行为 - 排序方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34006904/

相关文章:

java - 我的 while 循环无限运行,当我检查它时,它说 while 循环没有主体,而我认为它显然没有主体

android - 如何使用uiautomator基于同一父对象的其他对象选择特定对象

javascript - JavaScript 或 jQuery 可以根据多个条件对 JSON 数组进行排序吗?

Python - 根据总和对列表进行排序

java - 对于 AWS Kinesis 的 KCL Java 库,如何使用 requestShutdown 和 shutdown 进行正常关闭

java - 检测客户端已与jetty服务器断开连接(使用延续)

android - 如何向 Galaxy S3 上的溢出菜单添加操作?

css - 比较 CSS 规则特异性的高效算法

java - 试图将文件读入数组java

android - 为什么 fragment 有默认构造函数?