Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Collections.sort Comparator修改私有对象ID?_Java_Sorting_Collections - Fatal编程技术网

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

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

我知道这是一个有点奇怪的问题。我有一个构建的大陆对象的数组列表。在构造过程中,将设置它们的私有id,并且只能通过getId()方法访问它们。大陆对象没有setId()或类似内容

我使用一个自定义比较器从一个玩家对象中对这个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属性的示例输出。排序后大陆的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