2.6 Arbeiten mit assoziativen Arrays

Manchmal ist es notwendig, die assoziativen Arrays in ihrer Gesamtheit zu bearbeiten oder einzelne Assoziationen, die überflüssig geworden sind, zu löschen. Mit Hilfe des Attributes .itemcount ist es möglich, die Anzahl der vorhandenen Einträge abzufragen, hierzu muss der Name des Arrays als Index dienen.

window WMain

{

  integer Kanal [ string ];

    .Kanal [ "RTL" ] := 65;

    .Kanal [ "ARD" ] := 14;

    .Kanal [ "ZDF" ] := 11;

}

rule integer Senderzahl()

{

  return ( WMain.itemcount[ .Kanal ]);  !! im Beispiel, 3

}

2.6.1 Die Methode index

Es ist auch möglich, die innere Ordnung der assoziativen Arrays abzufragen. Die innere Ordnung dient dem Dialog Manager nur zur Verwaltung. Der Anwender kann die innere Ordnung benutzen, um damit sein assoziatives Array zu durchlaufen.

Achtung

Die innere Ordnung der assoziativen Arrays dient nur zur internen Verwaltung. Diese innere Ordnung kann sich ändern. Sollten Sie eine Ordnung auf den Daten benötigen, was dann im allgemeinen auf einen Missbrauch der assoziativen Arrays schließen lässt, so müssen sie diese selbst berechnen. In diesem Fall empfehlen wir jedoch normale Arrays.

Mit der Methode :index() kann der Index aus der inneren Ordnung berechnet werden.

<Objekt>:index ( attribute <Name>, integer <InnereIndex> );

Wobei <Objekt> das Objekt ist, an dem der Array <Name> definiert ist. Der <InnereIndex> ist ein Index nach innerer Ordnung, diese Ordnung wird über integer Zahlen von 1 bis zur Anzahl der Einträge definiert.

Beispiel

window WMain

{

  integer Kanal [ string ];

    .Kanal [ "RTL" ] := 65;

    .Kanal [ "ARD" ] := 14;

    .Kanal [ "ZDF" ] := 11;

}

rule void DruckeSender()

{

  variable integer I;

  for I : = 1 to WMain.itemcount[ .Kanal ]

  do

    print WMain.Kanal[ WMain:index(.Kanal, I ) ];

  endfor

}

In Zeile 11 wird die Schleife von 1 bis zur Anzahl der Einträge durchlaufen, gemäß der inneren Ordnung. In Zeile 13 wird der Index berechnet (WMain:index(.Kanal, I )) und mit diesem dann das assoziative Array .Kanal indiziert.

2.6.2 Die Methode delete

Um beliebige Einträge in dem assoziativen Feld zu löschen, steht dem Anwender die Methode :delete() zur Verfügung.

<Objekt>:delete ( attribute <Name>, anyvalue <Index> );

Wobei <Objekt> das Objekt ist, an dem der Array <Name> definiert ist. Der <Index> gibt den Eintrag an, der gelöscht werden soll.

Beispiel

window WMain

{

  integer Kanal [ string ];

    .Kanal [ "RTL" ] := 65;

    .Kanal [ "ARD" ] := 14;

    .Kanal [ "ZDF" ] := 11;

}

rule void LoescheSender()

{

  variable integer I;

  for I : =  WMain.itemcount[ .Kanal ] to 1 step -1

  do

    WMain:delete( .Kanal, WMain:index(.Kanal, I ) );

  endfor

}

 

!! Zweite, eleganter programmierte Loeschroutine

rule void LoescheSender_2()

{

  while (WMain.itemcount[ .Kanal ] > 0)

  do

    WMain:delete( .Kanal, WMain:index(.Kanal, 1 ) );

  end

}

 

!! Dritte Variante der Loeschfunktion

!! Hier wird der Name direkt benutzt

rule void LoescheSenderPerNamen()

{

  WMain:delete( .Kanal, "RTL" );

  WMain:delete( .Kanal, "ZDF" );

  WMain:delete( .Kanal, "ARD" );

}

Die ersten zwei Regeln haben die identische Funktion, bei der ersten wird die innere Ordnung ausgenutzt und per Schleife von Ende bis zum Anfang durchlaufen. Man beachte hier, dass sich die innere Ordnung durch den Löschvorgang natürlich ändert, deshalb wird hier von hinten gelöscht. Solange Einträge vorhanden sind, gibt es einen ersten Eintrag gemäß der inneren Ordnung. Dies nützt die zweite Regel welche immer den ersten Eintrag löscht.

Die dritte Regel funktioniert nur, wenn man die Indizes der Einträge kennt.