2016-03-20 2 views
0

私は値pawnArrayを含む配列を持っています。私は最高の値を取得するが、私はカスタムオブジェクトでlibgdx配列のコピーを作成するにはどうしたらいいですか?

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

    return best; 
} 

が、私はそれゆえ、このメソッドは動作しませんので、配列をコピーする必要がありますgetPawn()私はカスタムクラスのメソッドを使用してpawnArrayで最高値を見つける必要があります。この配列のコピーを作るにはどうすればいいですか?

+0

配列を複製して並べ替えることは、最も大きな値を選択するには非常に高価です。 – Tenfour04

答えて

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は値が等しいことを意味します。 値が<の場合、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

上記のコードは単なるサンプルであり、チューニングが必要です。しかし、コレクションソートのためのComparatorロジックを実装していない限り、プログラマが定義したObjectをどのようにソートするか分かりません。外部リファレンスの

あなたの問題はJavaの配列であるならば、私は、あなたがそれらの多くの異なる操作のためのクラスjava.util.Arraysのメソッドを持っています(構文はPawn[]ある)tutorialpoint

+0

実際、私の問題はソートされていません。私はすでに配列を並べ替えることができます。元の配列を並べ替えるのではなく、コピーを作成し、並べ替え、最大値を取得して元の配列を保持したいのです。 –

2

に簡単な例を実行している示唆しています。

配列クラスでもして、Cloneableを実装するので
Pawn[] newArr = Arrays.copyOf(oldArr, oldArr.length); 

または、::

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

注意これらの両方がある浅いコピー、提供することを何を求めているがで達成することができます配列は互いに独立しています(一方はソートでき、他方のインデックスは影響を受けません)が、その内容は異なります。

編集:あなたの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[] 
+0

Java配列とlibgdx配列は2つのものですが、Libgdxは性能とGCの振る舞いのために配列を扱う方法が異なりますので、答えは何もありません –

+0

コメントをいただきありがとうございます。 –

1

私は、配列をコピーして最高の値を取得するためにソートしたいので、別の答えを追加します。私の他の答えは配列のコピーを扱い、tjagoの答えは "最大値"が何であるかをカスタマイズするためにカスタムコンパレータでソートを扱います。しかし、libgdx Array<T>クラスには、配列のソートされたコピーを作成することなく、あなたが望むだけの処理をする方法があるようです。

ソートされた配列のの値が最小、最大、何でも必要な場合、このソリューションはコード、メモリ、および時間を節約します。複数を必要とする場合は、配列の並べ替えが高速になる可能性があります。

私が話している方法が提供コンパレータに従ってN 番目の要素を返し、Array.selectRankedです。オブジェクト自体の代わりにその要素のインデックスを返す別のメソッド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); 
0

回答あなたの質問に:どのように私はlibgdx配列のコピーを作成することができます

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

またはポーンのArrayオブジェクトがすでに存在する場合

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

最初の解決策は、関数の完了時に削除される新しいArrayオブジェクトを作成します。つまり、ガベージコレクタによって失われた時間を意味します。

しかし、私はTenfour04に同意します:配列を複製して並べ替えることは、最も大きな値を選択するのに非常に費用がかかります。

関連する問題