gpt4 book ai didi

Java Collections.sort Comparator修改私有(private)对象ID?

转载 作者:行者123 更新时间:2023-11-30 08:14:31 25 4
gpt4 key购买 nike

我知道这是一个有点奇怪的问题。我有一个构造的 Continent 对象的 ArrayList。在构造期间,它们的私有(private) ID 已设置,并且只能通过 getId() 方法访问。 Continent 对象没有 setId() 等。

我正在使用来自 Player 对象的自定义比较器对这个 ArrayList 进行排序。

private ArrayList<Continent> sortContinentsByOwnership(ArrayList<Continent> continents)
{
Collections.sort(continents, new Comparator<Continent>(){
@Override
public int compare(Continent a, Continent b)
{
Float a_unowned_percentage = a.getUnownedPercentage();
Float b_unowned_percentage = b.getUnownedPercentage();
return a_unowned_percentage.compareTo(b_unowned_percentage);
}
});
return continents;
}

这在排序对象时非常有效。但是,在将此方法与以下代码一起使用后,大陆的 id 字段被“修改”并设置为与其他排序对象一致。

contested_continents = this.sortContinentsByOwnership(contested_continents);

我已确保对象已正确排序,但这里有一些示例输出在排序尝试前后访问大陆的 id 属性。排序后大陆的 id 反射(reflect)了从中调用排序的对象的 id 字段,在本例中为 Player 对象。

Continents Pre-Sort - 0 2 6 7 8 
Continents Post-Sort - 5 5 5 5 5

Continents Pre-Sort - 1 2 10
Continents Post-Sort - 0 0 0

Continents Pre-Sort - 0 4 6 11
Continents Post-Sort - 1 1 1 1

访问这些对象的其他属性可以看出,在id属性之外仍然是具有相同元素的相同对象。

在代码的任何地方,无论是排序还是其他,我都没有在做任何类似 continent.id = player.id 的事情,但排序似乎以某种方式这样做。

欢迎提出任何建议或建议,如有必要,我很乐意提供其他资源。谢谢。

最佳答案

During construction, their private id is set, and only accessible through a getId() method. There is no setId() or the like for the Continent object.

由于您不打算修改 id 字段,我建议将其声明为 final。这将保证它不会在构造函数之外更改,并且更容易发现它现在正在更改的位置。

关于Java Collections.sort Comparator修改私有(private)对象ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29459332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com