Exempel på array: PlayList

Flash Player 9 och senare, Adobe AIR 1.0 och senare

I exemplet PlayList visas olika tekniker för hur du arbetar med arrayer. Du lär dig samtidigt som du skapar ett program för att hantera en spellista med musiklåtar. Detta omfattar följande:

  • Skapa en indexerad array

  • Lägga till objekt i en indexerad array

  • Sortera en array med objekt som har olika egenskaper genom att använda olika sorteringsalternativ

  • Konvertera en array till en teckenavgränsad sträng

Programfilerna för det här exemplet finns på www.adobe.com/go/learn_programmingAS3samples_flash_se . Du hittar programfiler för PlayList i mappen Samples/PlayList. Programmet består av följande filer:

Fil

Beskrivning

PlayList.mxml

eller

PlayList.fla

Huvudprogramfilen i Flash (FLA) eller Flex (MXML).

com/example/programmingas3/playlist/PlayList.as

En klass som representerar en lista med låtar. Klassen använder en array för att lagra listan, och hanterar sorteringen av objekten i listan.

com/example/programmingas3/playlist/Song.as

Ett värdeobjekt som representerar information om en låt. Objekten som hanteras i klassen PlayList är Song-instanser.

com/example/programmingas3/playlist/SortProperty.as

En pseudonumrering vars tillgängliga värden representerar egenskaper i klassen Song där en lista med Song-objekt kan sorteras.

klassen PlayList – översikt

Med klassen PlayList hanterar du en uppsättning Song-objekt. Den har publika metoder med funktioner för att lägga till en låt i spellistan (metoden addSong() ) och för att sortera låtar i listan (metoden sortList() ). Dessutom innehåller klassen en skrivskyddad åtkomstegenskap, songList , som ger dig tillgång till de faktiska låtarna i spellistan. Internt fungerar det så att klassen PlayList håller ordning på låtarna i en privat Array-variabel:

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

Förutom Array-variabeln _songs , som används i klassen PlayList för att hålla ordning på dess lista med låtar, finns två andra privata variabler för att dels hålla ordning på om listan behöver sorteras ( _needToSort ) och dels vilken egenskap som ska användas för att sortera låtlistan vid en given tidpunkt ( _currentSort ).

Precis som för alla objekt är deklarationen av en Array-instans endast halva jobbet när du skapar en Array. Innan du får åtkomst till egenskaper eller metoder för en Array-instans måste den skapas, vilket görs i klassen PlayLists konstruktor.

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

Den första raden i konstruktorn instansierar variabeln _songs så att den är klar att användas. Dessutom anropas metoden sortList() för att ange den första sorteringsegenskapen.

Lägga till en låt i listan

När en användare skriver in en ny låt i programmet används koden i inmatningsformuläret för att anropa metoden addSong() i klassen PlayList.

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

I addSong() anropas metoden push() för arrayen _songs , och objektet Song, som skickades till addSong() , läggs till som ett nytt element i den arrayen. Med metoden push() läggs det nya elementet till i slutet av arrayen, oberoende av sortering som kan ha gjorts tidigare. Detta betyder, att sedan metoden push() har anropats är det troligtvis så att spellistan inte längre är korrekt sorterad. Därför sätts variabeln _needToSort till true . Teoretiskt skulle det nu gå att omedelbart anropa metoden sortList() och undanröja behovet av att hålla reda på om listan är sorterad eller inte vid en viss tidpunkt. I praktiken finns det emellertid inget behov av att sortera spellistan förrän omedelbart innan den hämtas. Genom att skjuta upp sorteringen kommer ingen onödig sortering att ske när till exempel flera låtar läggs till innan listan hämtas.

Sortera en lista med låtar

Eftersom Song-instanserna som hanteras med spellistan är komplicerade objekt, kan användare av programmet vilja använda olika egenskaper för att sortera den, till exempel titel och år. I programmet PlayList innehåller uppgiften att sortera listan tre delar: identifiera egenskapen som ska användas för sorteringen, ange vilka sorteringsalternativ som ska användas för att sortera efter den egenskapen och utföra den faktiska sorteringsoperationen.

Sorteringsegenskaper

Ett Song-objekt används för att hålla reda på flera egenskaper, inklusive titel, artist, år, filnamn och användarens genreval. Av dessa lämpar sig endast de första tre för sortering. För att underlätta för utvecklarna innehåller exemplet klassen SortProperty, som fungerar som en numrering med värden som representerar de egenskaper som är tillgängliga för sortering.

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

Klassen SortProperty innehåller tre konstanter, TITLE , ARTIST och YEAR , vilka alla lagrar en sträng med det faktiska namnet på den associerade egenskap för klassen Song som kan användas för sorteringen. Närhelst en sorteringsegenskap anges i resten av koden görs det med numreringsmedlemmen. I exempelvis konstruktorn PlayList sorteras listan till att börja med genom att metoden sortList() anropas enligt följande:

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

Eftersom sorteringsegenskapen anges som SortProperty.TITLE sorteras låtarna efter deras titlar.

Sortera efter egenskap och ange sorteringsalternativ

Den faktiska sorteringen av spellistan görs med klassen PlayList i metoden sortList() enligt följande:

    /** 
     * 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; 
    }

När sorteringen sker efter titel eller artist passar det bäst att göra den i bokstavsordning, men när den sker efter årtal är det mest logiska att göra en numerisk sortering. Satsen switch används för att definiera rätt sorteringsalternativ, som sparas i variabeln sortOptions , enligt det värde som angetts i parametern sortProperty . Här används återigen de namngivna numreringsmedlemmarna, i stället för de hårdkodade värdena, för att skilja egenskaperna åt.

När sorteringsegenskapen och sorteringsalternativen är bestämda sorteras arrayen _songs genom att metoden sortOn() anropas, med dessa två värden som parametrar. Den aktuella sorteringsegenskapen spelas in och den aktuella spellistan sorteras.

Kombinera arrayelement i en teckenavgränsad sträng

Förutom att använda en array för att underhålla spellistan i klassen PlayList används i detta exempel arrayer även i klassen Song för att hantera genrelistan som låten tillhör. Titta på följande kodutdrag från definitionen för klassen Song:

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(";"); 
}

När du skapar en ny Song-instans definieras genres -parametern, som används för att ange vilken genre som låten tillhör, som en Array-instans. Detta är praktiskt när du vill gruppera flera genrer i en enda variabel som kan skickas till konstruktorn. Internt behåller emellertid klassen Song genrerna i den privata variabeln _genres som en semikolonavgränsad String-instans. Array-parametern konverteras till en semikolonavgränsad sträng genom att dess join() -metod anropas med stränglitteralvärdet ";" som den angivna avgränsaren.

På samma sätt tillåter genres -åtkomster att genrer ställs in eller hämtas som en array:

    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(";"); 
    }

Åtkomsten genres set uppträder på exakt samma sätt som konstruktorn; den accepterar en array och anropar metoden join() för att konvertera den till en semikolonavgränsad sträng. Med åtkomsten get utförs motsatt åtgärd: _genres -variabelns split() -metod anropas och strängen delas upp i en värdearray med hjälp av den angivna avgränsaren (stränglitteralvärdet ";" som tidigare).