我有一个包含值pawnArray
的数组。我需要在pawnArray中找到最高值,所以使用自定义类方法getPawn()
我检索到最高值,但我
public static Pawn getPawn(Array<Pawn> strollpawns) {
Array<Pawn> pawns = strollpawns;
pawns.sort();
Pawn best = pawns.get(0);
return best;
}
因此,我需要复制数组,因为这种方法不起作用。如何制作这个数组的副本?
答案 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:复制数组并对其进行排序是选择最大价值的一种非常昂贵的方式。