我知道这是一个奇怪的问题。我有一个构造的Continent对象的ArrayList。在构造期间,它们的私有id已设置,并且只能通过getId()方法访问。 Continent对象没有setId()等。
我正在使用Player对象中的自定义Comparator对此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字段是&#39; munged&#39;并与其他已排序的对象一致地设置。
contested_continents = this.sortContinentsByOwnership(contested_continents);
我已确保对象已正确排序,但这是一些示例输出,在排序尝试之前和之后访问大陆的id属性。排序后的大陆的id反映了从中调用排序的对象的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这样的事情,但排序似乎是以某种方式这样做。
欢迎提出任何建议或建议,如有必要,我很乐意提供其他资料。谢天谢地。
答案 0 :(得分:3)
在构造期间,它们的私有id已设置,并且只能通过getId()方法访问。 Continent对象没有setId()等。
由于您不打算修改id
字段,我建议将其声明为final
。这样可以保证它不会在构造函数外部更改,并且可以更容易地发现它现在被更改的位置。