Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 02-02-2006, 14:42   #1 (permalink)
409coffeemaker
Gast
 
Beiträge: n/a
Strinbestandteil in Array suchen, Wildcardprinzip

Hi zusammen,

ich habe einen Prototype für die Suche von Strings in Arrays aus dem Forum übernommen.

PHP-Code:
Array.prototype.indexOf = function(element) {
    var 
this.length;
    
this[-1] = element;
    while (
this[--l] !== element) {
    }
    
delete this[-1];
    return 
l;
};

ASSetPropFlags(Array.prototype, ["indexOf"], 1);
Array.
prototype.inArray = function(element) {
    return (
this.indexOf(element) !== -1);
};

ASSetPropFlags(Array.prototype, ["inArray"], 1); 

Mittels dieses Prototypes kann ich Strings im Array suchen. Die Suchstrings werden durch einen Key.Listener erzeugt, wobei eine Suche immer aus exakt 8 Zeichen bestehen muss.

PHP-Code:
/* Die Strings im Array sind immer so lang, wie in _global.requiredCharLength angegeben, hier mal als Beispiel: 8.

Die Sucheingabe muss demnach auch 8 Zeichen lang sein.
*/

_global.code.length == _global.requiredCharLength checkCode(_global.code) : null;



//Barcode Auswertung
function checkCode(code) {
//suche den string im array
    
var index _global.codePool.indexOf(code);

    
//wenn der string gefunden wurde, wird der die position dessen im array zurückgegeben und eine datei ausgeführt.
    
if (index != -1) {
        
execFile(_global.filePool[index][0], _global.filePool[index][1], code);
    } else {
//wenn der string nicht gefunden wurde, handelt es sich um eine ungültige angabe und der suchstring wird auf 0 zurückgesetzt.
        
_global.code '';
    }


So… das klappt wunderbar und einwandfrei.


Wenn ich 88888888 eintippe und dieser dann im array ist, wird das aufgerufen.

Mein Anliegen ist nun, das ich gerne mit Wildcards arbeiten möchte… unszwar am Anfang und am Ende der Arraystrings.

Im Array steht nun z.B. 89******
Eine Suche nach 89111111, 89123456, 89XXXXXX, sollte demnach immer ein Ergebnis zurückgeben, sobald die Zahlenfolge 89 am Anfang entdeckt wird.

Mit anderen Worten… man vergleicht nicht nur einem String direkt mit den WErten im Array, sondern geht jeden Wert im Array entsprechend seiner Zeichenlänge durch und vergleicht so Zeichen für Zeichen. Immer dann, wenn im Array ein * (Wildcard) im String ist, dann ist der Vergleich egal und es wird die nächste Stelle verglichen.


Ich werde jetzt mal versuchen, den Array Prototype dahingehend zu erweitern, das ich eine for-schleife für den Vergleich einbaue… ich würde mich trotzdem über ein paar Vorschläge und Ideen eurerseits freuen

Meine Ergebnisse stelle ich unabhängig davon dann hier vor.

Liebe Grüße
Coffeemaker
  Mit Zitat antworten
Alt 02-02-2006, 15:39   #2 (permalink)
409coffeemaker
Gast
 
Beiträge: n/a
Naja, Krückencode… aber funktioniert…


PHP-Code:
Array.prototype.indexOf = function(element) {
    var 
this.length;
    for (var 
0i<li++) {
        var 
match_char 0;
        var 
match_wildcard 0;
        for (var 
el 0el<_global.requiredCharLengthel++) {
            if (
this[i].substring(el, (el+1)) != '*') {
                if (
this[i].substring(el, (el+1)) == element.substring(el, (el+1))) {
                    
match_char++;
                }
            } else if (
this[i].substring(el, (el+1)) == '*') {
                
match_wildcard++;
            }
        }
        if ((
match_char) == (_global.requiredCharLength-match_wildcard)) {
            return 
i;
        }
    }
    return -
1;
}; 





Der Array wird durchwandert und dann jeder String im entsprechenden Element Zeichen für Zeichen verglichen… ist ne Wildcard drin, dann machts nix, wenn es nicht passt.

Jeder Treffer wird registriert… und jede Wildcard auch. Am Ende ziehe ich dann die Menge der Wildcards von der Stringlänge ab und schaue so, ob die benötigte Anzahl von Wildcards erreicht ist.

Wenn ja… dann geb ich den Arrayindex zurück. Return beendet dann die Schleife, soviel ich weiss.

Ansonsten latscht der durch den ganzen Array und quittiert die Mühe am Ende mit return -1.



Wenn jemand eine elegantere Methode hat… tell me

Liebe Grüße
Yves
  Mit Zitat antworten
Alt 02-02-2006, 18:33   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 18.114
viel unterschiedlicher ist es nicht.
a) die array-elemente können auch unterschiedlich lang sein
b) es können auch mehrere elemente zu dem pattern passen
Code:
Array.prototype.indexOf = function(pattern) {
	var found_ary = [];
	var pattern_len = pattern.length;
	var i = this.length;
	while (i--) {
		if (this[i].length == pattern_len) {
			var ok = true;
			var j = pattern_len;
			while (j--) {
				var charP = pattern.charAt(j);
				if (charP != '*') {
					if (charP != this[i].charAt(j)) {
						ok = false;
						break;
					}
				}
			}
			if (ok) {
				found_ary.push(i);
			}
		}
	}
	return found_ary;
};
//
var test_ary = ["Unterschiedlich", "Maus", "Auto", "Haus"];
var found_ary = test_ary.indexOf("*au*");
trace("gefunden: "+found_ary);
var i = found_ary.length;
while (i--) {
	trace(test_ary[found_ary[i]]);
}
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (02-02-2006 um 19:18 Uhr)
hgseib ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:15 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2014 Marc Thiele