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:
View Code JAVA
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:
View Code JAVA
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); } |