Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: oxyd21 am 22.12.10 - 15:16:14

Titel: ArrayList in LS
Beitrag von: oxyd21 am 22.12.10 - 15:16:14
Hallo,

in Java u.ä. gibt es die ArrayList. In diesem Datentyp kann ich Objekte anfügen, wieder rauslöschen usw.

In Lotusscript hab ich irgendwie Probleme, mein derzeitiges Problem umzusetzen. Ich möchte Objekte in einem Array speichern und dieses auch wieder entfernen. Dazu wäre wie gesagt die ArrayList ganz gut, da sie Vorteile von Beiden vereint. In LS steh ich da auf dem Schlauch, da beide Strukturen mit Objekten von Haus aus etwas eingeschränkt sind (if Object1 = Object2).

Gibt's ne möglichkeit ein Add, IndexOf oder Remove nachzubilden.

VG, Michael
Titel: Re: ArrayList in LS
Beitrag von: Peter Klett am 23.12.10 - 09:29:24
Wie wäre es  mit Listen?

Dim meinContainer List As Variant

Da kannst Du alles reinpacken und auch wieder entfernen. Ansprechbar ist jedes Element über einen Namen.

z.B.

Set meinContainer ("MeineDatenbank") = db
Print meinContainer ("MeineDatenbank").Title
Erase meinContainer ("MeineDatenbank")
If IsElement (meinContainer ("MeineDatenbank")) Then
   ...
End If

meinContainer ("einfacherText") = "Das ist nur ein Text"
Print meinContainer ("einfacherText")

usw.

Natürlich kannst Du Listen auch genauer spezifizieren

Dim meineDatenbanken List As NotesDatabase
Dim meineDokumente List As NotesDocument
Dim meineTexte List As String
Titel: Re: ArrayList in LS
Beitrag von: ata am 04.01.11 - 09:23:36
@Peter,

das ist grundsätzlich richtig - in Listen kann man alles mögliche packen, auch NotesObjekte. Es kam aber nach meiner Erfahrung vor, daß man damit einen Server in die Knie zwingen konnte, wenn die Instanzen eine gewisse Zahl überschritten - ich habe ca. 15.000 Instanzen im Kopf, die sich auf dem Server agent-übergreifend addieren können. Von daher muß man bei der Verwendung mit Objekten etwas vorsichtig sein. Keinerlei Probleme hat man mit Strings oder anderen Datentypen. Da sind die Listen irre schnell und haben ansonsten kein Limit wie Arrays...

Zwischendurch hatte ich mal eine Notiz, daß es in den neuen Versionen behoben wäre, validiert hatte ich es aber noch nicht - also habe ich es immer noch im Hinterkopf, wenn ich damit arbeite... ;)

Toni
Titel: Re: ArrayList in LS
Beitrag von: flaite am 04.01.11 - 10:05:38
Notes Listen entsprechen den Datentypen von java.util. Map.
ArrayList würd eher Redimensionierbare Arrays entsprechen.

Lotus Script:
// deklarieren von variablen array
dim myList as String()
Dim i as Integer

REM Sachen in Liste tun:

redim preserve myList(0)
myList(0) = "hallo"
redimPreserve myList(1)
myList(1) = "welt"



Rem Lesen aus Liste
for i = 0 to ubound(myList)
 msgbox "Element "+ i + " von myList:" + myList(i)
end for

JAVA 
// deklarieren von liste
List <String> myList = new ArrayList<String>();

// sachen tun in liste
myList.add("hallo");
myList.add("Welt");


// lesen aus liste:
int i = 0;
for (String aMember : myList) {
 logger.debug("Element " + i + " von myList:" + aMember);
  i++;
}
Titel: Re: ArrayList in LS
Beitrag von: pram am 04.01.11 - 18:13:06
@ata ich kann bestätigen, dass ein Client ca. 8000 NotesDocument-Objekte und ein Server ca 10000 in einem Array/Liste verwalten kann, dann gehen die Document-Handles aus.

Andere Objekte (Instanzen eigener Klassen) kann man um einiges mehr anlegen, wir haben eine ArrayList wie du sie von Java kennst in unser Framework implementiert:
http://www.foconis-object-framework.de/lsdoc/HFIK-6UAJZ7_%2885A7E3333558450B2BB29A5ADE3A3D37%29.html

Gruß
Roland
Titel: Re: ArrayList in LS
Beitrag von: Peter Klett am 05.01.11 - 07:28:53
@ata

da hast Du natürlich recht, m.W. sind Listen grundsätzlich nur durch den verfügbaren Arbeitsspeicher begrenzt. Wenn ich Dokumente in eine Liste aufnehme, verbrauchen die natürlich viel mehr Speicher, als wenn nur ein String aufgenommen wird. Bei einem gerade ausgeführten Test unter 8.5.1 über Citrix rauchte der Client bei Aufnahme des Dokumentes 23.662 in eine Liste ab. Der gleiche Test in der gleichen DB unter 7.03 lokal liest gerade Dokument 27.500 (werde den Test aber abbrechen, dauert mir zu lange), habe lokal wohl mehr Ressourcen (Arbeitsspeicher). (Nachtrag: Ende war bei Dokument 28.245)

Etwas besonders verhalten sich neue Dokumente, da hatte ich mal ein Problem bei über 3.000 neuen ungespeicherten Dokumenten, die mochte Notes nicht.

Bei Massenverarbeitung von Dokumenten merke ich mir in der Liste nur die UniversalID und greife bei Bedarf über die ID auf das Dokument zu. Das ist zwar gefühlt geringfügig langsamer, packt dafür aber viel mehr Dokumente.

@Pitiyankee, @pram

in Euren Beispielen arbeitet Ihr mit Arrays, nicht mit Listen, die sind generell in der Größe eingeschränkt.
Titel: Re: ArrayList in LS
Beitrag von: pram am 05.01.11 - 09:40:45
@peter

das stimmt natürlich, in Arrays kann man max 65k Elemente packen, wobei Arrays wohl schneller sind als Listen, insb. wenn man einen numerischen Index hat.

Ähnliche Tests wie du mit Dokumente in ein Array habe ich auch mal gemacht und da war bei ca 8000 am Client schluss. Die Grenze scheint wohl sehr von den verfügbaren Ressourcen abzuhängen.

Zur Massenverarbeitung kann man je nach Anwendungsfall auch die NotesDocumentCollection verwenden (diese mach intern auch nichts anderes, als sich die Note-ID zu merken)
Die Dokumente kommen dann allerdings nicht unbedingt in der Reihenfolge zurück in der man sie einfügt und man muss einige Tricks machen um sich eine leere Collection zu erzeugen.
Titel: Re: ArrayList in LS
Beitrag von: flaite am 06.01.11 - 08:13:19
Peter,

wobei "List" in LotusScript in einer für Programmiersprachen höchst singulären Weise gebraucht wird. List meint in aller Regel so etwas wie einen hinsichtlich seiner Elemente variablen Array. Und java.util.ArrayList sowieso. Die Verwendung des Begriffs "List" in LotusScript stößt Java-Programmierern bei LotusScript meist verwirrend auf, da sie eine andere Datenstruktur erwarten. Hatten wir hier schon öfters.  

Gruß Axel
Titel: Re: ArrayList in LS
Beitrag von: ata am 09.01.11 - 08:28:37
... eine leere Collection erzeugen ist nicht schwer - es gibt die Möglichkeit Profildokumente einer Notesdatenbank in einer Collection zu initialisieren. Wenn du hier nach einem Profil suchst, das es nicht gibt, hast du eine leere Collection. Der kannst du dann deine Dokumente hinzufügen - die sind in der Folge, wie du sie eingefügt hast...

Toni
Titel: Re: ArrayList in LS
Beitrag von: oxyd21 am 10.01.11 - 08:03:43
Da bin ich mal ein paar Tage nicht da und schon füllt sich der Thread.  :)

Ich denke ich werde mich mal dran machen, mir die Struktur nach meinen Bedürfnissen aufzubauen. Die Grenzen wären hier erst einmal vernachlässigbar, da die Datenstruktur nur eine "geringe" Anzahl von meinen Objekten enthalten soll. Ist sicherlich dann nicht uneingeschränkt einsetzbar aber, aber solange man die Grenzen kennt, wird's wohl passen.

Titel: Re: ArrayList in LS
Beitrag von: oxyd21 am 11.01.11 - 07:27:41
Moin,

hab's jetzt mal anhand der Java Dokumentation mal nach programmiert. Ist wirklich nichts weltbewegendes, sondern wirklich nur eine Sammlung von Methoden, um ein dynamisches Array zu bestücken bzw. zu bearbeiten.

Vorteile, bei der Verwendung von Dokumenten zum Bestücken des Konstrukts sehe ich im Moment nicht. Jedoch ist es sicherlich recht brauchbar, wenn man es mit einer begrenzten Anzahl von Objekten bestückt.

Lessons learned: Mit dem ArrayList-Konstrukt, das ich in meine Standardbibliotheken integriert habe, habe ich nun eine Datenstruktur, in der ich kleinere Mengen von Daten halten kann, ohne mir großartig Gedanken drüber machen muss.

VG, Michael