如何使用自定义对象创建libgdx数组的副本?

时间:2016-03-20 07:50:23

标签: java arrays libgdx

我有一个包含值pawnArray的数组。我需要在pawnArray中找到最高值,所以使用自定义类方法getPawn()我检索到最高值,但我

    public static Pawn getPawn(Array<Pawn> strollpawns) {
    Array<Pawn> pawns = strollpawns;
    pawns.sort();
    Pawn best = pawns.get(0);

    return best;
}
因此,我需要复制数组,因为这种方法不起作用。如何制作这个数组的副本?

4 个答案:

答案 0 :(得分:2)

如果您的问题是Java数组(语法为Pawn[]),那么您可以在类java.util.Arrays中使用方法对它们进行许多不同的操作。您所要求的可以通过以下方式完成:

Pawn[] newArr = Arrays.copyOf(oldArr, oldArr.length);

或者,因为数组类实现了Cloneable,还有:

Pawn[] newArr = (Pawn[]) oldArr.clone(); // I don't remember if the cast is necessary

请注意,这两个提供了浅拷贝,也就是说,数组彼此独立(您可以对其中一个进行排序,而另一个中的索引不受影响)但其内容不是。< / p> 编辑:有人向我指出,你的Array<T>实际上是libgdx中的一个类。查看文档,然后,您可以简单地使用the constructor taking another instance of Array来创建浅层副本,因为文档说新实例将具有相同的类型的后备阵列(不是同一个实例) )。例如:

Array<T> newArr = new Array<>(oldArr); // oldArr can be either Array<? extends T> or T[]

答案 1 :(得分:1)

我正在为此添加一个单独的答案,因为您要复制数组并对其进行排序以检索最高值。我的另一个答案涉及复制数组,而tjago的答案涉及使用自定义Comparator进行排序,以便自定义“最大值”。但是,似乎libgdx Array<T>类有一个方法可以做你想要的,而不必制作数组的排序副本。

如果您只需要排序数组中的一个值,此解决方案可以节省代码,内存和时间:最小值,最大值,等等。如果您需要多个,那么对数组进行排序可能会更快。

我所说的方法是Array.selectRanked,它根据提供的Comparator 返回 n th 元素。还有另一种方法selectRankedIndex,它返回该元素的索引而不是对象本身。您可以像这样使用它:

// If Pawn implements Comparable<Pawn>:
Pawn minVal = arr.selectRanked(Comparator.naturalOrder(), 1);
Pawn maxVal = arr.selectRanked(Comparator.naturalOrder(), arr.size);

// If it does not implement Comparable, you need to provide a Comparator<Pawn>:
// Assuming Pawn has an "int getValue()" method that we want to compare:
Pawn minVal = arr.selectRanked(Comparator.comparingInt(Pawn::getValue), 1);
// You could also write your own implementation directly:
Comparator<Pawn> comp = (a,b) -> /* your int-returning logic here */;
Pawn minVal = arr.selectRanked(comp, 1);

答案 2 :(得分:0)

看来你有一个与java有关的问题。为了帮助你进行排序在java对象编程中,存在方法重写和接口的概念。

排序的特殊界面是Comparator,您可以将其内联到这样的方法中。

Collections.sort(pawns ,new Comparator<Student>(){
                 public int compare(Pawn1 p1,Pawn2 p2){
                       // Write your logic here.
                       //ie.:
                       return p1.score - p2.score; 
                       //or for different order
                       return p2.score - p1.score;
                 }});

如果此比较器返回值== 0表示该值相等; 如果值&lt; 0表示p1大于p2,因此交换它们。

或者将他放在你的Object类中,如:

Class Pawn implements Comparator {
       private String name;
       private Position[][] posXY;
       private int value;
       ....
       Pawn() { ... }
       ...
       public int compare(Pawn1 p1,Pawn2 p2){
                       return p1.value- p2.value; 
       }

}

然后在您的代码中,您可以按照原定的意图调用:

pawns.sort();
Pawn best = pawns.get(0);

并且正如预期的那样,您应该从ArrayList获得最大值Pawn。

以上代码只是示例,需要进行调整。但是你应该得到一个很好的概述,因为Java不知道如何对程序员定义的对象进行排序,除非他为Collection排序实现了Comparator逻辑。

供外部参考我建议在tutorialpoint

上运行一个简单示例

答案 3 :(得分:0)

回答您的问题:如何创建libgdx数组的副本

Array<Pawn> pawns = new Array<Pawn>(strollpawns);

或者如果pawns Array对象已经存在

pawns.clear();
pawns.addAll(strollpawns);

第一个解决方案将创建一个新的Array对象,该对象将在函数完成时删除,这意味着垃圾收集器会丢失时间!

但我同意Tenfour04:复制数组并对其进行排序是选择最大价值的一种非常昂贵的方式。