# Mehr-Dimensionale ArrayList o.Ä.



## rockbottom (27. Jun 2009)

Hallo, ich bräuchte etwas wie eine Mehr-Dimensionale ArrayList aber komme irgendwie damit nicht klar...

Zweck: ich möchte UserId´s  nach dem "Schema" ArraySchreibweise:

[x-koordinat][y-koordinate][Liste mit UserID] 

speichern ohne vorher die Anzahl der UserId´s zu kennen.

ich habe bisher:


```
private ArrayList<ArrayList<ArrayList<Integer>>> mapArray = new ArrayList<ArrayList<ArrayList<Integer>>>();
```

nur bekomme ich natürlich eine indexOutOfBounce Fehlermeldung

nun hatte ich das schon umgeschrieben zu:


```
private ArrayList<ArrayList> mapArray = new ArrayList<ArrayList>(); 

//weiterer code

	public void initMapArray()
	{
		int i;
		int j;
		ArrayList tempListx;
		ArrayList tempListy;
		for(i = 0; i <= ROWS; i++)
		{
			//tempListx = mapArray.get(i);
			ArrayList<ArrayList> xMap = new ArrayList<ArrayList>();
			//tempListx.add(i, xMap);
			//mapArray.add(i, xMap);
			
			mapArray.add(i, xMap);
			for(j = 0; i <= COLS; j++)
			{
				tempListy = mapArray.get(i);
				ArrayList<ArrayList<Integer>> yMap = new ArrayList<ArrayList<Integer>>();
				tempListy.add(j, yMap);
			}
		}
	}
```


bekomme dann aber bei folgender Zeile:


```
ArrayList<Integer> currentField = mapArray.get(i).get(j);
```

den Fehler das ein Object gefunden wurde und keine ArrayList<Integer>

Könnte jemand so nett sein und mir meinen Denkfehler mitteilen, oder alternativ eine Andere Lösung vorschlagen unter der Vorraussetzung das wie gesagt die Anzahl der UserId´s nicht vorher bekannt ist und ich ungerne 500 leere Felder durchitterieren möchte.

Danke für jede Hilfe


----------



## SlaterB (27. Jun 2009)

> ArrayList<ArrayList> mapArray = new ArrayList<ArrayList>(); 
mapArray.get(i) liefert also eine ArrayList,

wie kannst du erwarten, dass get(j) auf eine ganz normale ArrayList eine ArrayList<Integer> liefert statt Object?
ganz in Ruhe drüber nachdenken, dann wird doch alles klar

deine vorherige Idee
ArrayList<ArrayList<ArrayList<Integer>>> mapArray = new ArrayList<ArrayList<ArrayList<Integer>>>();
wäre dagegen korrekt, so komisch es auch aussieht, 
wenn es dort zu einem Fehler kommt, dann hilft es nicht, irgendwas ziellos wegzukürzen,
sondern überlegt vorgehen

----

alternativ verwende eine richtige Map Koordinaten -> Liste,
Koordinaten könnte im einfachen Falle ein String sein, x +", "+y,


----------



## rockbottom (27. Jun 2009)

Danke für die Info das mein erster Gedanke richtig war...

ich habe zwar nun ein andere Problem aber die exception hab ich erstmal abgefangen mittels


```
try {
			return mapArray.get(uX).get(uY);
		} catch (IndexOutOfBoundsException e) {
			ArrayList<Integer> blankList = new ArrayList<Integer>();
			return blankList;
		}
```

Nun muss ich rausfinden warum dem User seine Position und Andere Daten nicht mitgeteilt werden, ist aber ne andere Baustelle, denke liegt an fehlenden DB einträgen die ich mittels Hibernate hole



riesigen dank erstmal


----------



## rockbottom (27. Jun 2009)

trotzdem bekomme ichs nicht hin....


```
ArrayList<ArrayList<Integer>> tempArrayListX;
    	ArrayList<Integer> tempArrayListY;
    	try {
    		tempArrayListX = mapArray.get(uX);
    	} catch (IndexOutOfBoundsException e) {
    		tempArrayListX  = new ArrayList<ArrayList<Integer>>();
    		mapArray.add(uX, tempArrayListX);
    	}
    	
    	try {
    		tempArrayListY = mapArray.get(uX).get(uY);
    	} catch (IndexOutOfBoundsException e) {
    		tempArrayListY  = new ArrayList<Integer>();
    		mapArray.get(uX).add(uY, tempArrayListY);
    	}
    	
    		mapArray.get(uX).get(uY).add(tempUserID);
```

wieder die IndexOutOfBounce Exception..

aber wieso diesmal?


----------



## rockbottom (27. Jun 2009)

ok auch das hab ich hinbekommen... nur verfolgt mich die exception

mapArray.get(i).get(j);

was ist daran flasch... weil da müsste eigentlich was drinstehen ich trag doch hier was ein:


```
public void addMapArrayContent(Positions uP)//umgestellt auf ArrayList 3d
	{
		int uX = getUserX(uP);
		int uY = getUserY(uP);
		
    	long tempUserIDL = uP.getUserID();
    	int tempUserID = (int) tempUserIDL;
    	ArrayList<Integer> tempList = getMapArrayContent(uP);
    	tempList.add(tempUserID);
    	
    	
    	ArrayList<ArrayList<Integer>> tempArrayListX;
    	ArrayList<Integer> tempArrayListY;
    	try {
    		mapArray.get(uX).add(tempList);
    	} catch (IndexOutOfBoundsException e) {
    		Trace ("~~~~~~~~~~~ EXCEPTION ~~~~~~~~~~~~~");
    	}
}
```

mfg


----------



## SlaterB (27. Jun 2009)

mapArray ist in deinem Code weder definiert, noch wird je was eingefügt, 
was soll man da rumraten?


----------



## rockbottom (27. Jun 2009)

SlaterB hat gesagt.:


> mapArray ist in deinem Code weder definiert, noch wird je was eingefügt,
> was soll man da rumraten?



gar nix wenn man so schlau war oben mit zu lesen

private ArrayList<ArrayList<ArrayList<Integer>>> mapArray = new ArrayList<ArrayList<ArrayList<Integer>>>();

steht doch da oben... son bischen denken und assozieren können iss schon von vorteil...

aber lass nur stecken... ich find das schon alleine raus...


----------



## SlaterB (27. Jun 2009)

wenn man bedenkt, dass ich diese Zeile sogar selber schon zitiert habe, ist die Argumentation gerade zu verwegen aufgebaut,
aber jedem wie es beliebt, mit dem Tonfall kann man auch weit kommen


----------



## Landei (27. Jun 2009)

Damit wirst du nicht glücklich. Ich würde empfehlen, das Ganze mit einer Map abzubilden, wobei der Schlüssel aus beiden Koordinaten besteht. Dann noch eine kleine Hilfsmethode, und es sollte einigermaßen bequem zu benutzen sein:

```
private Map<int[], List<Int>> map = new HashMap<int[],List<Int>>();
...
public List<Int> getUserIds(int x, int y) {
   int[] key =  new int[]{x,y};
   List<Int> userIds = map.get(key);
   if (userIds == null) {
      userIds = new ArrayList<Int>();
      map.put(key, userIds); 
   }
   return userIds; 
}
```

Du brauchst dann kein setUserIds, du kannst dir einfach per getUserIds eine leere Liste holen und füllen, da sie ja schon der Map hinzugefügt ist.


----------



## aokai (27. Jun 2009)

Du schreibs das du die Anzahl der UserIDs nicht kennst. Kennst du den Koordinaten bereich vorher? Wenn ja würde ich das als 2Dim Array abbilden und den Quatsch mit verschachtelten Arraylist lassen. Kannst ja in dem Array dann ne Liste speichern.


----------



## Landei (27. Jun 2009)

An sowas hatte ich auch gedacht, aber leider läßt sich nur List[][] und nicht List<Integer>[][] definieren.


----------



## rockbottom (29. Jun 2009)

SlaterB hat gesagt.:


> wenn man bedenkt, dass ich diese Zeile sogar selber schon zitiert habe, ist die Argumentation gerade zu verwegen aufgebaut,
> aber jedem wie es beliebt, mit dem Tonfall kann man auch weit kommen


 sehr hilfreiches kommentar, typische reaktion eines mod, soviel zum tonfall...

wie gesagt ich habs inzwischen selber rausgefunden , hat zwar ganze 9 stunden eiens Samstages gedauert aber hey seit dem ich in java foren fragen stelle bin ich es gewöhnt das mehr blöde kommentare ohne zweckbezogenen inhalt kommen als sachdienliche hinweise... warte ma du hast hinweise auf ne miese rechtschreibung noch vergessen... 

weisste mit mir kann man sich eigentlich vernünftig unterhalten, das hört aber dann auf wenn mich leute am langen arm verhungern lassen wollen und blöd kommen, für ne verpisste 5 minuten antwort, denk ma drüber nach und stell dir die Frage ob das auch zu netiquetete gehört

@ landei danke, aber hab gerad erst wieder hier rein geschaut, und es läuft nun mit der besagten mehrdimensionalen arraylist, ob das performant genug ist wenn 1000 user gleichzeitig online sind und alle 150ms und das ganze dementsprechend oft durchlaufen werden muss wird man sehen, falls nicht teste ich halt in einer dauer von 4-8 wochen mal alle datentypen der sorte collection durch.. besser als sich ständig in foren rum zu ärgern

auf hilfe in nem java forum zu warten hab ich weder zeit noch lust... sorry aber ich war noch nie ein krummbückler... und java entwickler sind für mich auch nur menschen und nicht das als was sie sich sehen... höhere wesen die ihr wissen von gott erhielten...

in dem sinne... mod kannst dann bitte meine regi hier löschen, denke der "tonfall" hier hat nun ausgereicht... aber irgendwann reichts einem einfach mal also stecks dir sonstwohin und nu tschüss

mfg und bye bye


----------

