Java Collections.sort Comparator修改私有对象ID?
我知道这是一个有点奇怪的问题。我有一个构建的大陆对象的数组列表。在构造过程中,将设置它们的私有id,并且只能通过getId()方法访问它们。大陆对象没有setId()或类似内容 我使用一个自定义比较器从一个玩家对象中对这个ArrayList进行排序Java Collections.sort Comparator修改私有对象ID?,java,sorting,collections,Java,Sorting,Collections,我知道这是一个有点奇怪的问题。我有一个构建的大陆对象的数组列表。在构造过程中,将设置它们的私有id,并且只能通过getId()方法访问它们。大陆对象没有setId()或类似内容 我使用一个自定义比较器从一个玩家对象中对这个ArrayList进行排序 private ArrayList<Continent> sortContinentsByOwnership(ArrayList<Continent> continents) { Collections.sort(co
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属性的示例输出。排序后大陆的id反映了从中调用排序的对象的id字段,在本例中为玩家对象
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属性之外具有相同的元素
在代码中的任何地方,排序或其他,我都在做类似于contraction.id=player.id的事情,但是排序似乎在以某种方式做这件事
欢迎提出任何建议或建议,如有必要,我很乐意提供额外的来源。谢谢你
在构造过程中,将设置它们的私有id,并且只能通过getId()方法访问它们。大陆对象没有setId()或类似内容
由于您不打算修改
id
字段,我建议将其声明为final
。这将保证它不会在构造函数之外更改,并且更容易发现正在更改的位置。请向我们展示整个Continental类。如果您将id
声明为final
,会发生什么?谢谢,这有助于解决问题。当我声明id为final时,我发现了bug。编译产生错误:无法为最终变量id赋值。在Continental中的比较函数中,我试图创建一个函数作用域id变量,id=this.getPlayerId();。当然,这并没有抛出一个未定义类型的错误,因为它是在Continental类中定义的,我猜“This”是在java中推断出来的。谢谢你的帮助。Anderson,如果您添加一个建议将id声明为final作为故障排除措施的答案,我将很乐意接受。同样感谢Eran,发布Continental类将有助于解决此问题,尽管我最初怀疑在哪里会发现错误。@Orbit很高兴提供帮助!
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