Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: bikerboy am 18.11.08 - 16:15:12

Titel: Position in Liste bestimmen
Beitrag von: bikerboy am 18.11.08 - 16:15:12
So hoffe ich kann nun auch mal nen produktiven Beitrag bringen.

Problemstellung : Ich möchte nach einem Wert in einer Liste suchen und wenn dieser enthalten ist, möchte ich Position haben. Da ich keinen passenendes Posting gefunden habe und auch keine @Function die so etwas kann habe ich mir selber was gebaut und hoffe damit anderen weiter helfen zu können


Code
_position := 0 ; 
@For(_n := 1 ; _n < @Elements(_list) &  _position = 0 ; _n := _n + 1 ; _position := @If(@Subset(@Subset(_list; _n); - 1) = _key ; _n ; 0));

Ich bitte um anregende Kritik
Titel: Re: Position in Liste bestimmen
Beitrag von: jBubbleBoy am 18.11.08 - 16:19:55
geht mit @member
Titel: Re: Position in Liste bestimmen
Beitrag von: bikerboy am 18.11.08 - 16:23:22
Hmmm nagut hatte nur soweit gelesen bist returns 1
Titel: Re: Position in Liste bestimmen
Beitrag von: bikerboy am 18.11.08 - 16:25:58
Gut dann hier das Upgrade dass , dir alle Positionen zurück gibt

Code
@For(_n := 1 ; _n < @Elements(_list) ; _n := _n + 1 ; 
_pos := @If(@Subset(@Subset(_list; _n); - 1) = _key ; _n ; 0);
@If(_pos != 0 ; _positions := _positions : @Text(_pos); ""));


Bitte um weitere Kritik
Titel: Re: Position in Liste bestimmen
Beitrag von: dirk_2909 am 18.11.08 - 17:55:38
Und was spricht gegen @Member ??

 :P
Titel: Re: Position in Liste bestimmen
Beitrag von: koehlerbv am 18.11.08 - 18:09:03
@Mewmber gibt nur den ersten "Treffer" zurück, Dirk. Roberts Lösung erzeugt aber ggf. eine Liste aller Treffer.

Was mir nicht gefällt: @Text(_pos). Wenn schon, dann sollte eine Zahl oder Zahlenliste zurückgegeben werden.

Bernhard
Titel: Re: Position in Liste bestimmen
Beitrag von: dirk_2909 am 19.11.08 - 06:58:01
Ok. Wenn man es braucht.
Titel: Re: Position in Liste bestimmen
Beitrag von: bikerboy am 19.11.08 - 09:30:50
So bin auf Bernhards Kritik eingegangen

Hatte aber ein Problem mit der Zahlenliste, wenn diese leer ist, habe es nun folgendermaßen gelöst;

Code
_positions := 0;

@For(_n := 1 ; _n < @Elements(_list) ; _n := _n + 1 ; 	_pos := @If(@Subset(@Subset(_list; _n); - 1) = _key ; _n ; 0);
																				@If(_pos != 0 ; _positions := _positions : _pos; ""));

_positions := @Subset(_positions; - (@Elements(_positions) - 1));

Läuft natürlich auf einen Fehler, wenn er gar Nichts findet
Titel: Re: Position in Liste bestimmen
Beitrag von: Thomas Schulte am 19.11.08 - 11:46:26
Deine Lösung hat, außer dem Fehler den du bereits nennst, wenn das gesuchte Element nicht enthalten ist, noch einen anderen Haken.

Stell doch an die letzte Stelle deiner Werteliste das gesuchte Element noch einmal und schau dir dann deine Positionen die du zurückbekommst an.

Wenn du nur das letzte Element hast bekommst du den Fehler beim Subset wieder. Wenn es in der Liste an anderer Stelle noch vorkommt entfällt bei deiner Lösung das letzte Element.

Eine funktionierende Lösung deines Problemes mit einem etwas anderen Ansatz schaut zum Beispiel so aus:
Code
REM {Baue eine Zählerliste mit der gleichen Anzahl von Elementen};
@For(_i:=1;_i<= @Elements(fldListe);_i :=_i+1;_Counter := _Counter : @Text(_i));
REM {Verheirate beide Listen, einfache ConCat Operation (möglich weil die Anzahl der Elemente beider Listen gleich sein muss),};
REM {aber weil das erste Element der _Counter Liste leer ist mach da einen Trim außenrum, damit beide Listen gleich lang sind};
_ListeCount := @Trim(_Counter) + ":" + fldListe;
REM {Entferne aus der Liste alles was nicht dem gesuchten Wert entspricht und gebe nur den _Counter Teil zurück. Entferne alle leeren Elemente};
@Trim(@Transform(_ListeCount;"x";@If(@Word(x;":";2)=fldWert;@Word(x;":";1);"")))

Diesen Ansatz kann man übrigens mit wenigen Handgriffen so umbauen, das er dir die Positionen aller Elemente in der Liste zurückgibt, in denen dein gesuchter Wert auch nur teilweise enthalten ist.
Titel: Re: Position in Liste bestimmen
Beitrag von: bikerboy am 19.11.08 - 12:30:14


Stell doch an die letzte Stelle deiner Werteliste das gesuchte Element noch einmal und schau dir dann deine Positionen die du zurückbekommst an.



Hmm passt bei mir, hier der Beispiel Code :

Code
_pos := 0 ;
_positions := 0;
_list :="Eins" : "Zwei" : "Drei" : "Vier":"Eins" : "Zwei" : "Drei" : "Vier":
_key := "Vier";


@For(_n := 1 ; _n < @Elements(_list) ; _n := _n + 1 ; 	_pos := @If(@Subset(@Subset(_list; _n); - 1) = _key ; _n ; 0);
																				@If(_pos != 0 ; _positions := _positions : _pos; ""));

_positions := @Subset(_positions; - (@Elements(_positions) - 1));

@Prompt([Ok]; "Position" ; @Implode(@Text(_positions);"#"))
Titel: Re: Position in Liste bestimmen
Beitrag von: Thomas Schulte am 19.11.08 - 12:41:57
Ersetz mal den Doppelpunkt nach deiner letzten Vier durch einen Strichpunkt (so wie es sich gehört wenn man in der Formelsprache unterwegs ist) und versuch es dann noch mal.

Klar das du, so wie du es geschrieben hast, die Vier bekommst. Dein letztes Element in der Liste ist ja schließlich nicht "Vier", sondern LEER.
Titel: Re: Position in Liste bestimmen
Beitrag von: bikerboy am 19.11.08 - 12:48:36
Sorry das war denn wohl vertippt mit Semikolon hat es dann nicht funktioniert, bis ich aus ....

Code
@For(_n := 1 ; _n < @Elements(_list) ; _n := _n + 1 ; ....
,


Code
@For(_n := 1 ; _n <= @Elements(_list) ; _n := _n + 1 ; 

gemacht habe
Titel: Re: Position in Liste bestimmen
Beitrag von: Werner Götz am 20.11.08 - 10:56:12
Mein einfacher Vorschlag wäre:

i:=0;
@If(fldliste = fldwert; @transform(fldliste; "zeile"; @If((i := i + 1) & @False; ""; zeile = fldwert; i; @Nothing) ); 0)


wobei ich 0 (die Zahl ganz hinten ...) zurückgebe, wenn es den Wert in der Liste nicht gibt.

-Werner
Titel: Re: Position in Liste bestimmen
Beitrag von: Werner Götz am 20.11.08 - 11:00:45
Wem die "komische" Zuweisung innerhalb der @If-Anweisung nicht gefällt:

i:=0;
@If(fldliste = fldwert; @transform(fldliste; "zeile"; @Do(i := i + 1; @If(zeile = fldwert; i; @Nothing))); 0) 

-Werner