Willkommen in der Webstatt Zum Webstatt Blog und Stories
nuit nuit am 26.03.08 21:54

Ich will 2 Arrays vergleichen und es soll das gleiche drinnen sein, in welcher reihenfolge ist wurscht ^^

ich hab eine funktion (die von mir ist) aber irgendwie will ich sie verschnellern, btw. ich benutz mootools...

fals jemand auf die schnelle einen schnelleren algo weiss....immer her damit ^^
sooo sieht jetzt der Algo aus:
Array.implement({


/**
* compare - Returns true for equal Arrays
*
* @example
* [1,4,5,2,5].compare([4,5,1,5,2]) == true
* [1,4,5,2,5].compare([1,4,5,2,5},true) == true
* [1,4,5,2,5].compare([4,1,2,5,5},true) == false
* [1,3,2].compare([2,4,1]) == false
*
* @return {Boolean}
* @param {Object} Array
* {Boolean} Position Sensitiv
*/
compare: function(array,position) {
if(this.length != array.length) return false;

if(position) {
for(i = 0; i < this.length; i++) {
if(this[i] != array[i]) return false;
}
} else {
var contain = false;
for(i = 0; i < this.length; i++) {
for(y = 0; y < array.length; y++) {
if(this[i] == array[y]) {
array = array.unset(y);
contain = true;
break;
}
}
if(!contain) {
return false;
} else {
contain = false;
}
}
}
return true;
},


/**
* unset - Unsetting a element in the array by there Index
*
* @example
* [1,5,3].unset(1) == [1,3]
*
* @return {Object} Array
* @param {Object} Array
*/
unset: function(key) {
var buffer = new Array();
this.each(function(item,index){
if(key != index) {
buffer[buffer.length] = item;
}
});
return buffer;
},
});

netcup.de Warum gibt es hier Werbung?
Michael Michael am 27.03.08 09:51

Nur eine Idee für den Fall, dass position nicht true ist (drei Schritte sind nötig)

1) Die unset Funktion entfernt ein Element nicht nach dem Index sondern nach dem Wert (und zwar nur das erste Vorkommen)
2) In der compare Funktion erstellst du eine Kopie des ersten Arrays und entfernst mittels unset jeweils den aktuellen Wert aus der Kopie
3) Wenn die Kopie nach dem Durchlaufen des Arrays noch Elemente enthält, sind die Arrays nicht identisch

Viele Grüße,
Michael

nuit nuit am 27.03.08 16:12

Quote
Original von Michael
Nur eine Idee für den Fall, dass position nicht true ist (drei Schritte sind nötig)

1) Die unset Funktion entfernt ein Element nicht nach dem Index sondern nach dem Wert (und zwar nur das erste Vorkommen)
2) In der compare Funktion erstellst du eine Kopie des ersten Arrays und entfernst mittels unset jeweils den aktuellen Wert aus der Kopie
3) Wenn die Kopie nach dem Durchlaufen des Arrays noch Elemente enthält, sind die Arrays nicht identisch

Viele Grüße,
Michael

die ideen sind gut, funktionieren aber nur bei eindimensionalen arrays...gut ich vergleiche hier nur eindimensionale...aber sobald ich ein multidimensionales array hab, krieg ich das problem in unset, weil ich dann den wert direkt vergleichen muss, und der wert kanan ja dann ein Array sein, welches sich in der Form wieder unterscheidet...wobei warte mal...ist ja egal, ist ja vom gleichen Array....

noja...mal durchdenken...

zu 2) bzw. 3)
das würde ja bedeuten, dass die Arrays eine unterschiedliche Anzahl von Elementen hat, was ja nicht sein kann, da dass vorher shcon aussortiert wird, muss ich ja garnicht mehr vergleichen.
oder versteh ich das jetzt grad falsch?

gruss nuit

Michael Michael am 28.03.08 08:42

Ich dachte es mir so, dass du die Arrays A und B dadurch vergleichst, dass du die Elemente von B aus A (oder einer Kopie von A) entfernst und nachdem alle Elemente entfernt wurden prüfst, ob noch Elemente in A vorhanden sind (das wären dann Elemente, die nicht in B wären). Falls ja sind die Arrays nicht gleich.

Davor bleibt natürlich die Prüfung, ob die Arrays eine gleiche Zahl von Elementen enthalten.

Den Vergleich mehrdimensionaler Arrays würde ich mit Rekursion nach dem gleichen Schema lösen.

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt