Arrays-Beispiel: PlayList

Flash Player 9 und höher, Adobe AIR 1.0 und höher

Im Beispiel „PlayList“ werden Verfahren zum Verwenden von Arrays im Kontext einer Anwendung verdeutlicht, mit der eine Wiedergabeliste mit Musiktiteln verwaltet wird. Dies sind im Einzelnen:

  • Erstellen eines indizierten Arrays

  • Hinzufügen von Elementen zu einem indizierten Array

  • Sortieren eines Arrays von Objekten nach verschiedenen Eigenschaften mit verschiedenen Sortieroptionen

  • Konvertieren eines Arrays in einen durch Zeichen getrennten String

Die Anwendungsdateien für dieses Beispiel finden Sie unter www.adobe.com/go/learn_programmingAS3samples_flash_de . Die Dateien der Anwendung „PlayList“ befinden sich im Ordner „Samples/PlayList“. Die Anwendung umfasst die folgenden Dateien:

Datei

Beschreibung

PlayList.mxml

oder

PlayList.fla

Die Hauptanwendungsdatei im Flash-Format (FLA) oder Flex-Format (MXML).

com/example/programmingas3/playlist/PlayList.as

Eine Klasse, die eine Liste mit Musiktiteln darstellt. Die Klasse verwendet ein Array zum Speichern der Liste und verwaltet die Sortierung der Listeneinträge.

com/example/programmingas3/playlist/Song.as

Ein Wertobjekt mit Informationen zu einem einzelnen Musiktitel. Die Elemente, die mit der PlayList-Klasse verwaltet werden, sind Song-Instanzen.

com/example/programmingas3/playlist/SortProperty.as

Eine Pseudoaufzählung, deren verfügbare Werte die Eigenschaften der Song-Klasse darstellen, nach denen eine Liste mit Song-Objekten sortiert werden kann.

Überblick über die PlayList-Klasse

Mit der PlayList-Klasse wird eine Gruppe von Song-Objekten verwaltet. Sie verfügt über öffentliche Methoden mit Funktionen zum Hinzufügen eines Musiktitels zur Wiedergabeliste (die addSong() -Methode) und zum Sortieren der Musiktitel in der Liste (die sortList() -Methode). Darüber hinaus enthält die Klasse die schreibgeschützte Accessor-Eigenschaft songList , mit der auf die eigentlichen Musiktitel in der Wiedergabeliste zugegriffen werden kann. Intern werden die Musiktitel der PlayList-Klasse mit einer privaten Array-Variablen protokolliert:

public class PlayList 
{ 
    private var _songs:Array; 
    private var _currentSort:SortProperty = null; 
    private var _needToSort:Boolean = false; 
    ... 
}

Neben der Array-Variablen _songs zum Protokollieren der Liste mit Musiktiteln der PlayList-Klasse wird mit zwei weiteren privaten Variablen protokolliert, ob die Liste sortiert werden muss ( _needToSort ) und nach welcher Eigenschaft die Liste zu einem bestimmten Zeitpunkt sortiert wird ( _currentSort ).

Wie bei allen Objekten ist mit der Deklaration einer Array-Instanz nur ein Teil der Erstellung eines Arrays erledigt. Vor dem Zugreifen auf die Eigenschaften oder Methoden einer Array-Instanz muss diese instanziiert werden. Dies erfolgt über den Konstruktor der PlayList-Klasse.

    public function PlayList() 
    { 
        this._songs = new Array(); 
        // Set the initial sorting. 
        this.sortList(SortProperty.TITLE); 
    }

Mit der ersten Zeile des Konstruktors wird die _songs -Variable instanziiert, sodass sie verwendet werden kann. Darüber hinaus wird die sortList() -Methode aufgerufen, um die ursprüngliche Sortiereigenschaft festzulegen.

Hinzufügen eines Musiktitels zur Liste

Wenn ein Benutzer einen neuen Musiktitel in die Anwendung eingibt, wird mit dem Code im Dateneingabeformular die addSong() -Methode der PlayList-Klasse aufgerufen.

    /** 
     * Adds a song to the playlist. 
     */ 
    public function addSong(song:Song):void 
    { 
        this._songs.push(song); 
        this._needToSort = true; 
    }

In addSong() wird die push() -Methode des _songs -Arrays aufgerufen und das an addSong() übergebene Song-Objekt wird als neues Element in dieses Array eingefügt. Mit der push() -Methode wird das neue Element am Ende des Arrays eingefügt, unabhängig von zuvor durchgeführten Sortiervorgängen. Dies bedeutet, dass die Liste der Musiktitel nach dem Aufruf der push() -Methode wahrscheinlich nicht mehr korrekt sortiert ist, sodass die _needToSort -Variable auf true gesetzt wird. Theoretisch kann die sortList() -Methode sofort aufgerufen werden, sodass nicht protokolliert werden muss, ob die Liste zu einem bestimmten Zeitpunkt sortiert oder nicht sortiert ist. Praktisch muss die Liste mit Musiktiteln jedoch erst vor dem Abrufen sortiert werden. Durch Zurückstellen des Sortiervorgangs wird keine unnötige Sortierung durchgeführt, wenn beispielsweise mehrere Musiktitel zur Liste hinzugefügt werden, bevor die Liste abgerufen wird.

Sortieren der Liste mit Musiktiteln

Da es sich bei den über die Wiedergabeliste verwalteten Song-Instanzen um komplexe Objekte handelt, möchten Benutzer der Anwendung die Wiedergabeliste möglicherweise nach verschiedenen Eigenschaften sortieren, beispielsweise nach Musiktitel oder Veröffentlichungsjahr. In der Anwendung „PlayList“ setzt sich die Sortierung der Liste mit Musiktiteln aus drei Teilen zusammen: Identifizieren der Eigenschaft, nach der die Liste sortiert werden soll, Angeben der erforderlichen Sortieroptionen beim Sortieren nach dieser Eigenschaft und Durchführen des eigentlichen Sortiervorgangs.

Eigenschaften für die Sortierung

Ein Song-Objekt protokolliert mehrere Eigenschaften, einschließlich Musiktitel, Interpret, Veröffentlichungsjahr, Dateiname und benutzerdefinierter Genres, denen der Musiktitel zugeordnet wird. Nur die ersten drei Eigenschaften erweisen sich als praktisch für die Sortierung. Als Annehmlichkeit für Entwickler umfasst das Beispiel die SortProperty-Klasse, die als Aufzählung der Werte dient, mit denen die verfügbaren Sortiereigenschaften angegeben werden.

    public static const TITLE:SortProperty = new SortProperty("title"); 
    public static const ARTIST:SortProperty = new SortProperty("artist"); 
    public static const YEAR:SortProperty = new SortProperty("year");

Die SortProperty-Klasse enthält die drei Konstanten TITLE , ARTIST und YEAR , in denen jeweils ein String mit dem Namen der zugeordneten Eigenschaft der Song-Klasse gespeichert ist, die für die Sortierung verwendet werden kann. Im gesamten restlichen Code wird bei jeder Angabe einer Sortiereigenschaft das Aufzählungselement verwendet. Im PlayList-Konstruktor wird die Liste beispielsweise anfänglich durch Aufrufen der sortList() -Methode sortiert:

        // Set the initial sorting. 
        this.sortList(SortProperty.TITLE);

Da die Eigenschaft zum Sortieren durch SortProperty.TITLE angegeben wird, werden die Musiktitel nach Titel sortiert.

Sortieren nach Eigenschaft und Festlegen von Sortieroptionen

Die Sortierung der Liste mit Musiktiteln erfolgt über die sortList() -Methode der PlayList-Klasse:

    /** 
     * Sorts the list of songs according to the specified property. 
     */ 
    public function sortList(sortProperty:SortProperty):void 
    { 
        ... 
        var sortOptions:uint; 
        switch (sortProperty) 
        { 
            case SortProperty.TITLE: 
                sortOptions = Array.CASEINSENSITIVE; 
                break; 
            case SortProperty.ARTIST: 
                sortOptions = Array.CASEINSENSITIVE; 
                break; 
            case SortProperty.YEAR: 
                sortOptions = Array.NUMERIC; 
                break; 
        } 
         
        // Perform the actual sorting of the data. 
        this._songs.sortOn(sortProperty.propertyName, sortOptions); 
             
        // Save the current sort property. 
        this._currentSort = sortProperty; 
 
        // Record that the list is sorted. 
        this._needToSort = false; 
    }

Bei der Sortierung nach Titel oder Interpret empfiehlt sich die alphabetische Sortierung. Bei der Sortierung nach Jahr empfiehlt sich jedoch die numerische Sortierung. Mit der switch -Anweisung wird die geeignete Sortieroption, die in der Variablen sortOptions gespeichert ist, entsprechend dem im sortProperty -Parameter angegebenen Wert definiert. Hier wird erneut anhand der benannten Aufzählungselemente und nicht nach hartkodierten Werten zwischen den einzelnen Eigenschaften unterschieden.

Wenn die Sortiereigenschaft und die Sortieroptionen festgelegt sind, wird das _songs -Array durch Aufrufen der zugehörigen sortOn() -Methode sortiert. Dabei werden diese beiden Werte als Parameter übergeben. Die aktuelle Sortiereigenschaft sowie die Tatsache, dass die Wiedergabeliste derzeit sortiert ist, werden protokolliert.

Kombinieren von Array-Elementen in einem durch Zeichen getrennten String

Neben der Verwendung eines Arrays zum Verwalten der Wiedergabeliste in der PlayList-Klasse werden in diesem Beispiel auch Arrays in der Song-Klasse verwendet, um die Liste der Genres zu verwalten, denen ein bestimmter Musiktitel zugeordnet ist. Betrachten Sie das folgende Codesegment zur Definition der Song-Klasse:

private var _genres:String; 
 
public function Song(title:String, artist:String, year:uint, filename:String, genres:Array) 
{ 
    ... 
    // Genres are passed in as an array 
    // but stored as a semicolon-separated string. 
    this._genres = genres.join(";"); 
}

Beim Erstellen einer neuen Song-Instanz wird der genres -Parameter, mit dem das Genre (oder die Genres) des Musiktitels angegeben wird, als Array-Instanz definiert. Dadurch können mehrere Genres auf einfache Weise in einer einzelnen Variablen gruppiert werden, die dann an den Konstruktor übergeben werden kann. Intern werden die Genres jedoch in der privaten _genres -Variablen der Song-Klasse als durch Semikola getrennte String-Instanzen verwaltet. Der Array-Parameter wird in einen durch Semikola getrennten String konvertiert, indem die zugehörige join() -Methode mit dem Literalstring „;" als festgelegtem Trennzeichen aufgerufen wird.

Ebenso können mit den genres -Zugriffsmethoden Genres als Array festgelegt oder abgerufen werden:

    public function get genres():Array 
    { 
        // Genres are stored as a semicolon-separated String, 
        // so they need to be transformed into an Array to pass them back out. 
        return this._genres.split(";"); 
    } 
    public function set genres(value:Array):void 
    { 
        // Genres are passed in as an array, 
        // but stored as a semicolon-separated string. 
        this._genres = value.join(";"); 
    }

Die set -Zugriffsmethode von genres entspricht in ihrer Funktionsweise dem Konstruktor: Ihr wird ein Array übergeben, und sie ruft die join() -Methode auf, um das Array in einen durch Semikola getrennten String zu konvertieren. Die get -Zugriffsmethode führt den umgekehrten Vorgang aus: Die split() -Methode der _genres -Variablen wird aufgerufen. Sie unterteilt den String in ein Array von Werten mit dem angegebenen Trennzeichen (wie zuvor der Literalstring „;" ).