[AS3] Sorteren array gegeven bepaalde criteria

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Luke!
  • Registratie: Juli 2001
  • Laatst online: 08:56

Luke!

#Treinbaas
Topicstarter
Hoi,

Ik ben bezig met een fotogallery van een Flash-website en het lukt me niet een simpel probleem op te lossen. De situatie is als volgt.

De site haalt een lijst (foto)bestandsnamen uit een xml-bestand en plaats deze op volgorde zoals gelezen in een array allImages. Deze array heeft lengte allImages_amount en loopt van 0 tot allImages_amount-1

Ik heb een functie createImageList gemaakt die een array imageList maakt met alle fotobestandsnamen erin. Deze lijst moet voldoen aan de volgende criteria:
- de eerste n plaatsen (n is opgeslagen in de variable photoAmount) worden bezet door de laatste n foto's uit de bestandsnamenarray;
- de resterende plekken, zijnde allImages_amount - photoAmount, worden ingevuld met de resterende foto's, waarbij deze willekeurig gekozen moet zijn;
- iedere foto mag slechts eenmaal worden gekozen.

De onderstaande functie doet het volgende:
- de eerste n(=photoAmount) plekken toewijzen aan de laatste n(=photoAmount) foto's uit het xml-bestand;
- random een getal kiezen tussen 0 en allImages_amount - photoAmount (want dat is het aantal resterende foto's);
- kijken of de bestandsnaam die op de random gekozen plek staat al is opgeslagen op een eerdere positie in de uiteindelijke imageList (indien ja: opnieuw; indien nee: foto toewijzen).

De eerste twee stappen gaan goed, alleen daarna komt de functie maar tot allImages_amount - 1, c.q. vindt geen vrije foto meer en komt alsnog in een loop. Met andere woorden, ondanks dat er allImages_amount foto's zijn (deze waarde wordt bepaald uit het xml-bestand en is correct), kan het ding maar allImages_amount-1 foto's toewijzen en vindt voor de laatste plek geen vrije foto meer.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    var i;

    // Assign latest photos
    for (i=1;i<=photoAmount;i++)
    {
        imageList[i] = all_images[allImages_amount-i].@file;
    }
    
    // Assign other photos randomly
    for (i=photoAmount+1;i<=allImages_amount;i++)
    {
        var pickedImage = Math.floor((allImages_amount-photoAmount)*Math.random());
    
        // Check whether photo has been displayed before in storage list
        var dubbelCheckValue = dubbelCheck(pickedImage);
                
        // Assign photo or new attempt
        if (dubbelCheckValue == false)
        {
            imageList[i] = all_images[pickedImage].@file;
        }
        else
        {
            i--;
        }
    }
    
    // Check for already used photo
    function dubbelCheck(pickedImage):Boolean
    {
        var pickedImage;
        var dubbelCheckValue = false;
        
        for (var j=1;j<=i-1;j++) // controleren tot vorige positie
        {
            if (all_images[pickedImage].@file == imageList[j])
            {
                dubbelCheckValue = true;
            }
        }
        
        return dubbelCheckValue;
    }


Let op: de automatisch gegenereerde array allImages loopt van 0 tot allImages_amount - 1. De te vullen array imageList loopt van 1 tot allImages_amount. Ergens moet ik die positie 1 opschuiven vanwege andere output, en zo lang het maar consequent gebeurt moet dat hier kunnen.

Stel er zijn in totaal 50 foto's en photoAmount is 20, dat betekent dus dat uit de allImags-array eerst de laatste twintig foto's gekozen moeten worden (i=49..30) en vervolgens random de foto's 29.. 0.
Dus (imageList | allImages) = (1|49), (2|48), (3|47), ..., (20|30), (21|random-uit-30), (22|random-uit-29), ..., (50|random-uit-1).

Dit kan niet moeilijk zijn, maar ik zie het toch niet. Iemand een idee wat hier fout gaat?

[ Voor 5% gewijzigd door Luke! op 08-03-2009 02:36 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Is het probleem in jouw stuk code dat Random een getal tussen de 0 en de 1 retourneert? :)

-- edit --
hmm... denk het toch niet.

-- edit --
mogelijkheid 2
Moet je niet i -=2 doen ? Omdat je m 1 naar beneden brengt, en jouw iteratie m weer verhoogd ?

-- edit --
maar dan nog... je gebruikt random 8)7

[ Voor 61% gewijzigd door Verwijderd op 12-03-2009 13:44 ]


Acties:
  • 0 Henk 'm!

  • Luke!
  • Registratie: Juli 2001
  • Laatst online: 08:56

Luke!

#Treinbaas
Topicstarter
Nuh. :)
Ik snap het ook echt niet...

Acties:
  • 0 Henk 'm!

Verwijderd

Je gebruikt de globale variable i in de functie dubbelCheck maar je hebt er geen waarde aan toegewezen. edit: My bad, je hebt d'r wel een waarde aan toegekend, via // Assign other photos randomly

edit 2: Ik denk dat ik het nu zie: in
code:
1
2
3
// Assign latest photos
    for (i=1;i<=photoAmount;i++)
...


gaat i tot en met (photoAmount - 1). en in
code:
1
2
3
// Assign other photos randomly
    for (i=photoAmount+1;i<=allImages_amount;i++)
...

ga je verder met (photoAmount + 1). Je slaat dus één positie in imageList[i] over waardoor er geen plek meer is voor de laatste bestandsnaam.

[ Voor 84% gewijzigd door Verwijderd op 15-03-2009 16:01 ]


Acties:
  • 0 Henk 'm!

  • Sihaya
  • Registratie: Juni 2001
  • Niet online

Sihaya

Pasfoto:

Waarom laat je in de eerste for loop i op 1 beginnen? Array indices lopen in AS vanaf 0 tot en met array.length - 1, op deze manier kom je waarschijnlijk een element te kort.

Misschien is het trouwens handiger om fotos die je in imageList plaatst uit all_images te halen, dit scheelt de extra dubbel check.

signature has expired


Acties:
  • 0 Henk 'm!

  • Luke!
  • Registratie: Juli 2001
  • Laatst online: 08:56

Luke!

#Treinbaas
Topicstarter
Verwijderd schreef op zondag 15 maart 2009 @ 15:19:
edit 2: Ik denk dat ik het nu zie: in
code:
1
2
3
// Assign latest photos
    for (i=1;i<=photoAmount;i++)
...


gaat i tot en met (photoAmount - 1). en in
code:
1
2
3
// Assign other photos randomly
    for (i=photoAmount+1;i<=allImages_amount;i++)
...

ga je verder met (photoAmount + 1). Je slaat dus één positie in imageList[i] over waardoor er geen plek meer is voor de laatste bestandsnaam.
Positie 1 tot photoAmount worden gevuld door de eerste loop en photoAmount+1 tot allImages_amount door de tweede loop. Ik sla dan geen positie over.
Sihaya schreef op zondag 15 maart 2009 @ 15:48:
Waarom laat je in de eerste for loop i op 1 beginnen? Array indices lopen in AS vanaf 0 tot en met array.length - 1, op deze manier kom je waarschijnlijk een element te kort.
Ik heb de hele arrayinhoud één positie opgeschoven. Of je bij 0, 35 of 200000 begint maakt niet uit, als je maar consequent doorrekent. :P
Misschien is het trouwens handiger om fotos die je in imageList plaatst uit all_images te halen, dit scheelt de extra dubbel check.
Goed idee! Daar had ik nog niet aan gedacht.
Pagina: 1