CyclicList

Im Informatikpraktikum müssen wir die Felder von “Monopoly” verwalten. Da diese ringverkettet sind – eine Ringverkettung allerdings aufwändig und langsam ist – verkette ich die Felder nicht direkt, sondern speichere sie in einer Liste.
Dazu habe ich die die Klasse ArrayList entsprechend erweitert:

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
import java.util.*;
 
public class CyclicList<T> extends ArrayList<T>{
   public T getCyclic(int i){
      if(size()==0) throw new IndexOutOfBoundsException();
      while(i<0)i+=size();
      return get(i%size());
   }
 
   public ArrayList<T> getCyclicRange(int i, int length){
      ArrayList<T> ret=new ArrayList<T>(Math.abs(length));
      if(length>=0){
         for(int n=0;n<length;n++){
            ret.add(getCyclic(i));
            i++;
         }
      }else{
         length=-length;
         for(int n=0;n<length;n++){
            ret.add(getCyclic(i));
            i--;
         }
      }
 
      return ret;
   }
}

Bei meinem Anwendungsfall habe ich die Liste verwendet um die Monopoly Felder zu speichern. Damit wird das Ermitteln aller Folge-Felder recht simpel:

1
2
3
4
   public ArrayList<Field> getSubsequentFields(Field f, int length){
      int index=f.getIndex()+(length>0?1:-1);
      return listFields.getCyclicRange(index,length);
   }

Keine Kommentare

Noch keine Kommentare.

RSS Feed für Kommentare zu diesem Artikel. TrackBack URI

Hinterlasse einen Kommentar

WordPress Themes