Processing
Børre Stenseth
Skisser >Lister

Lister og arrays

Hva

Vi vil ofte ha behov for å handtere lineære samlinger av like variable, f.eks. tallrekker eller linjer i en tekst.

Vi har i prinsipp to innfallsvinkler til dette. Array som kan holde statiske lister. Det vil si at listestørrelsen er konstant. Alternativet er ArrayList der vi kan ekspandere og redusere størrelsen etter behov.

Begreper som du finner i dokumentasjonen til Processing Reference

array, ArrayList, StringList

og vi trenger å lage setninger som løper jgjennom lister:

for
Relevante Skisser
arrays, arraylist, stringlist

I de fleste eksemplene nedenfor lager vi ikke noen uttegninger. Vi skriver direkte til consolet (feltet under editoren)

Array

Vi setter først opp en enkel array av heltall, setter inn verdier og skriver dem ut.

_arrays.pde
/*
 En array er en ordnet saamling, liste, 
 av variable av samme type
*/
// vi vil lage en rekke med heltall
int[] tallRekke;
void setup(){
  // lager ferdig en rekke med plass til 3 heltall
  tallRekke=new int[3];
  // putter verdier inn i rekka
  // første posisjon i rekka er alltid 0
  tallRekke[0]=21;
  tallRekke[1]=212;
  tallRekke[2]=210; 
}
void draw(){
  // skriver til consolet i en for-løkke der
  // index++ betyr det samme som index=index+1
  for(int index=0; index < tallRekke.length; index++){
   println(tallRekke[index]);
  }
  
  noLoop();
}

Array er en enkel struktur. Vi kan lage arrays av hvilke typer data vi vil. Alle elementene må være av samme type. Vi kan bytte innholdet på et sted i arrayen, f.eks tallRekke[2]=7; Ulempen med array er at de er ganske stivbente når det gjelder størrelsen. Vi må bestemme oss for hvor mange elementer vi skal ha plass til når vi oppretter den.

Vi kan også lage arrayer med mer enn en dimensjon. Et enkelt eksempel:

_tabell.pde
// tabeller
String[][] tabell;
int antallRader=5;
int antallKolonner=8;
void setup(){
  size(200,200);
  // klargjør tabellen
  tabell=new String[antallRader][antallKolonner];
  for(int r=0; r < antallRader;r++){
    for(int k=0; k < antallKolonner;k++){
      tabell[r][k]=str(r)+str(k);
    }
  }
}
void draw(){
  background(255);
  fill(0);
  for(int r=0; r < antallRader;r++){
    for(int k=0; k < antallKolonner;k++){
      text(tabell[r][k],20+k*20,50+r*20);
    }
  }
}

Som gir følgende output

capture

ArrayList

ArrayList er en langt mer fleksibel konstruksjon. Her kan vi legge til, fjerne og bytte ellementer etter behov, men det er fortsatt slik at vi må ha samme type element i alle plassene. (dette er en sannhet med modifikasjoner, men en drøfting av dette hører ikke hjemme her).

_arraylist.pde
/*
 En ArrayList er en dynamisk liste
 Der vi kan fjerne og sette inn elementer hvor vi vil
*/
// vi vil lage en rekke med heltall
// merk at vi skriver Integer, ikke int
ArrayList<Integer> tallRekke;
void setup(){
  // lager ferdig en tom rekke med ubegrenset 
  // utvidelsesmuligheter
  tallRekke=new ArrayList<Integer>();
  
  // putter verdier inn i lista
  tallRekke.add(21);     // sist
  tallRekke.add(22);     // sist
  tallRekke.add(0,20);   // i posisjon 0, dvs først
}
void draw(){
  // skriver til consolet i en for-løkke der
  // index++ betyr det samme som index=index+1
  for(int index=0; index < tallRekke.size(); index++){
     println(tallRekke.get(index));
  }
  
  // eller en enklere form
  // for alle tall t i lista
  println("------------");
  for(int t:tallRekke){
    println(t);
  }
  noLoop();
}

Stringlist

I tillegg til ArrayList vi du finne en rekke spesialiserte lister. Disse er spesialiserte fordi ulike elementtyper kan behandles på forskjellig måte. For eksempel har vi noe som heter StringList for å ta vare på tekster. En StringList har da blandt mye annet funksjonalitet for å sortere lista alfabetisk.

_stringlist.pde
/*
 En StringList er en spesialisert ArrayList 
 Der vi kan fjerne og sette inn elementer hvor vi vil
 og vi her en del tilleggsmuligheter som lar seg realisere
 fordi vi vet at alle elementene i lista er tekster
 Her viser vi sortering
*/
// vi vil lage en liste med navn
StringList navn;
void setup(){
  // lager en liste
  navn=new StringList();
  // legger til verdier i lista
  navn.append("Ole");
  navn.append("Atle");
  navn.append("Jens");
}
void draw(){
  // sorterer og skriver til consolet
  navn.sort();
  
  // for alle tall n i lista
  for(String n:navn){
    println(n);
  }
  noLoop();
}

Vi kan gjøre mye annet med lister av ulik type, og vi har også andre måter å gruppere elementr på en rene lineære lister. Sjekk dokumentasjonen.

Skisser >Lister