2016-03-20 5 views
0

Ich habe ein Array, das Werte pawnArray enthält. Ich brauche den höchsten Wert in pawnArray zu finden, so eine benutzerdefinierte Klasse Methode getPawn() ich den höchsten Wert abrufen, aber ich habeWie kann ich eine Kopie eines libgdx-Arrays mit benutzerdefinierten Objekten erstellen?

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

    return best; 
} 

ich daher das Array kopieren müssen, da diese Methode nicht funktioniert. Wie kann ich eine Kopie dieses Arrays erstellen?

+0

Das Duplizieren eines Arrays und das Sortieren ist eine sehr teure Methode, um den größten Wert auszuwählen. – Tenfour04

Antwort

0

Es scheint, dass Sie ein Java-bezogenes Problem haben. Um Ihnen beim Sortieren zu helfen In der Java-Objektprogrammierung gibt es ein Konzept für Methodenüberschreibung und Schnittstellen.

Spezielle Schnittstelle zum Sortieren ist Comparator, Sie können ihn entweder inline in Methode wie folgt setzen.

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; 
       }}); 

wenn dieser Komparator Rückgabewert == 0 ist der Wert gleich sind; Wenn Wert < 0 bedeutet, p1 ist größer als p2, also tauschen Sie sie aus.

Oder setzt ihn in Ihrer Objektklasse wie:

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; 
     } 

}

dann in Ihrem Code können Sie anrufen, wie Sie ursprünglich gedacht:

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

und wie erwartet sollten Sie ein Maximalwert Pawn von ArrayList.

Der obige Code ist nur Beispiel und erfordert tunning. Aber Sie sollten jetzt einen guten Überblick bekommen, da Java keine Ahnung hat, wie Objekte, die von einem Programmierer definiert wurden, sortiert werden, es sei denn, er implementiert die Komparatorlogik für die Sammlungssortierung.

für externe Referenz Ich schlage vor, ein einfaches Beispiel auf tutorialpoint

+0

Eigentlich ist mein Problem nicht sortieren. Ich kann mein Array bereits sortieren, das Problem ist, ich möchte nicht mein ursprüngliches Array sortieren, ich möchte eine Kopie erstellen, sortieren, Max-Wert erhalten und es verwenden, aber das ursprüngliche Array behalten. –

2

Wenn Ihr Problem mit Java-Arrays ist (die Syntax ist Pawn[]), dann haben Sie Methoden in der Klasse java.util.Arrays für viele verschiedene Operationen auf sie. Was Sie fordern mit erreicht werden könnte:

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

Oder, da Klassen Array klonbar implementieren, auch mit:

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

Beachten Sie, dass diese beidenflache Kopien zur Verfügung stellen, ist, dass die Arrays sind voneinander unabhängig (Sie können eins sortieren und die Indizes in dem anderen sind nicht betroffen), aber deren Inhalt nicht.

EDIT: es wurde freundlicherweise darauf hingewiesen, dass Ihre Array<T> eigentlich eine Klasse in libgdx ist. Wenn Sie die Dokumentation betrachten, können Sie einfach the constructor taking another instance of Array verwenden, um Ihre seichte Kopie zu erstellen, da das Dokument besagt, dass die neue Instanz denselben Typ des backing array (nicht die gleiche Instanz) haben wird. Zum Beispiel:

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

Java-Array und libgdx-Array sind 2 verschiedene Dinge, Libgdx bieten eine andere Möglichkeit, Arrays aus Gründen der Leistung und GC-Verhalten zu behandeln, so dass Ihre Antwort nichts zu tun haben –

+0

Danke für den Kommentar, ich habe die Antwort angepasst. –

1

Ich füge eine separate Antwort auf diese Frage, da Sie Ihre Array kopieren möchten, und ordnen es um den höchsten Wert abzurufen.Meine andere Antwort bezieht sich auf das Kopieren des Arrays, während Tjago's Antwort das Sortieren mit einem benutzerdefinierten Komparator behandelt, um den "maximalen Wert" anzupassen. Es scheint jedoch, dass die Klasse libgdx Array<T> eine Methode hat, genau das zu tun, was Sie wollen, ohne eine sortierte Kopie des Arrays erstellen zu müssen.

Diese Lösung erspart Ihnen Code, Speicher und Zeit, wenn Sie nur einen Wert aus dem sortierten Array benötigen: das Minimum, Maximum, was auch immer. Wenn Sie mehr als eins benötigen, ist es wahrscheinlich, dass das Sortieren des Arrays schneller ist.

Verfahren ich spreche Array.selectRanked ist, die die n th Element kehrt nach dem vorgesehenen Vergleicher. Es gibt eine andere Methode selectRankedIndex, die den Index dieses Elements anstelle des Objekts selbst zurückgibt. Man könnte es wie folgt verwenden:

// 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

Antwort auf Ihre Frage: Wie kann ich Kopie eines Libgdx Array zu erstellen

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

oder wenn das Array-Objekt Bauern bereits vorhanden

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

Die erste Lösung wird ein neues Array-Objekt erstellen, das nach Abschluss der Funktion gelöscht wird.

Aber ich stimme Tenfour04 zu: Das Duplizieren eines Arrays und Sortieren ist eine sehr teure Methode, den größten Wert auszuwählen.

Verwandte Themen