sort([comparefunction])

p-flash

Erfahrenes Mitglied
Hi,

ist es möglich in der CompareFunction nochmal eine andere Funktion aufzurufen? Funktioniert es dann mit dem Sortieren richtig?

Also:

PHP:
function compare (a, b)
  {
     wert = andereFunktion(a, b);
     
    if (wert == blabla)
  	 return 0;
  
    // ... etc
  }

Mein Code klappt nicht so richtig. Deshalb wollte ich erstmal die Fehlerquelle eingrenzen.

Bin dankbar für jeden Tip.

p-flash
 
Hi,

soweit ich weiß, musst Du in einer Sortierungs.Funktion alle drei möglichen Rückgabewerte (-1, 1, 0) angeben (möglicherweise auch in der richtigen Reihenfolge). Prinzipiell steht der Verwendung einer weiteren Funktion nichts im Weg.

Gruß
.
 
Hmm...könnte es daran liegen, dass ich mit Klassen arbeite und deshalb die Funktion nicht aufgerufen wird? die trace()-Befehle der anderen Funktion werden nämlich auch nicht angezeigt.


Hat du da eine Idee?

/edit
Das scheint wirklich das Problem zu sein. Wenn ich ein Attribut der Klasse trace, wird undefined angezeigt. Was kann man da machen?

p-flash
 
Zuletzt bearbeitet:
Hi,

da müsste ich Deine Klassenstruktur sehen.

Wenn sich die Funktion "compare" z.B. in einer Klasse befindet, die Funktion "andereFunktion" aber auf der Hauptzeitleiste, muss natürlich ein _root davor. Befindet sie sich in einer anderen Klasse, wäre es objektpfad.klassenname - ansonsten probiers mal mit "this" ...

Gruß
.
 
Also ich habe

PHP:
public function sortRangLinst () : Void
und

PHP:
public function compare (t1, t2) : Number

Das seltsame ist, das trace(this); in der Funktion compare undefined ergibt.

p-flash
 
Oh, stimmt - das wird sich ähnlich wie mit Intervallen verhalten. Zugriff auf Klassenmember solltest Du aber eigentlich haben: sezte einfach ein
Code:
public static var that:Klassentyp = this;
an den Anfang und arbeite dann in der Funktion damit statt mit "this".

Gruß
.
 
Hmm...aber das gilt doch dann für alle Objekte der Klasse. Die Variable that wird ja dann von jedem neu erstellten Objekt neu zugewiesen, oder täusche ich mich?

p-flash
 
Hi,

willst Du das nicht?

Was ich meine war z.B: folgendes:
Code:
class Sorter {
	public static var that:Sorter;
	
	public function Sorter() {
		that = this;
	}
	
	function doSort(a:Array):Void {
		a.sort(byLength);
	}
	
	function byLength(v1, v2):Number {
		// hier brauche ich die Referenz "that":
		return that.doCompare(v1, v2);
	}
	
	function doCompare(v1, v2):Number {
		if (v1.length < v2.length) {
			return 1;
		} else if (v1.length > v2.length) {
			return -1;
		} else {
			return 0;
		}
	}
}

Zum Testen:
Code:
import Sorter;

var bla = new Sorter();

var a = new Array("Apfel", "Birne", "Banane", "Pflaume");

trace(a);

bla.doSort(a);

trace(a);

Gruß
.
 
Die Idee ist gut. that müsste bei jedem Aufruf von doSort() neu zugewiesen werden, weil sonst nach dem erstellen eines neuen Objects das aktuelle nicht mehr zugreifbar ist.

Danke.

p-flash
 
... das verstehe ich nicht:

"that" wird ja im Konstruktur eine Referenz zugewiesen; es ist damit immer verfügbar, so lange das Objekt existiert.

Wie gesagt: ich kenne weder Deine Klassenstruktur noch Dein Vorhaben. Vielleicht wäre es sinnvoller, eine statische Methoder zu verwenden:
Code:
	function byLength(v1, v2):Number {
		// Klassenname bei statischer Funktion:
		return Sorter.doCompare(v1, v2);
	}
	
	static function doCompare(v1, v2):Number {
		if (v1.length < v2.length) {
		...
Grade wenn sich "doCompare" in einer anderen Klasse als "Sorter" befindet, macht das Sinn. Alternativ kannst Du der doSort-Methode natürlich eine Referenz auf das andere Objekt mitgeben.


Gruß
.
 

Neue Beiträge

Zurück