Webstatt.org - Community seit 2006 - 2012 (2024?)

Vergleich von 2 Arrays

Avatar user-271
26.03.2008 20: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;
},
});

#!/bin/bash
traurig){ neutral:& };:
Avatar user-253
27.03.2008 08: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

Avatar user-271
27.03.2008 15:12

Original von user-251el
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 user-271

#!/bin/bash
traurig){ neutral:& };:
Avatar user-253
28.03.2008 07: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.