ubuntuusers.de

[Java] 2D-Array mit gleichen Werten fuellen (zerofill, templatefill)

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

dersven

Anmeldungsdatum:
16. August 2005

Beiträge: 792

Wohnort: Kreuzlingen, Schweiz

Hallo. Wenn ich z.B einen zweidimensionalen int-array erzeuge, und in jedes der der Felder eine 0 schreibe moechte, mache ich es derzeit folgendermassen:

1
2
3
4
5
6
int feld[][] = new int[10][10];
for(int i=0; i<feld.length; i++) {
	for(int j=0; j<feld[i].length; j++) {
		feld[i][j] = 0;
	}
}

Fuer eigene Datentypen etwa so:

1
2
3
4
5
6
myType feld[][] = new myType[10][10];
for(int i=0; i<feld.length; i++) {
	for(int j=0; j<feld[i].length; j++) {
		feld[i][j] = new myType();
	}
}

Gibt es nicht eine standard-Funktion, die das fuer mich uebernimmt? in vielen Numerik-Tools gibt es z.B. Funktionen wie "zerofill". Dann Koennte ich es mir ersparen bei allen Initialisierungen immer eine verschachtelte Schleifenfunktion zu schreiben. (es sind leider immer @D-Array unterschiedlicher Typen).

Gruesse

NewProggie

Anmeldungsdatum:
22. November 2007

Beiträge: 124

Hallo,

imho bietet die Standard Java-API nichts entsprechendes an. Was spricht denn dagegen eine Funktion, ähnlich zu deiner, zu schreiben, die genau das macht, was du willst?

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Für ints und die anderen eingebauten Typen ist das Array per se mit 0 initialisiert, bzw. false für boolean. Es reicht dann also:

int feld[][] = new int[10][10];

Für die anderen Typen sehe ich 2 Ansätze, die beide nicht so überzeugen, und Du musst dazu die betreffenden Klassen ändern können:

Ein Interface, bei dem Du aber ein Dummyobjekt brauchst, und casten mußt, oder statische Factories, die dann aber nicht nach außen dokumentieren, daß sie geeignet sind für dieses Vorgehen:

 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
interface Gen2d 
{
	public Object [][] generate (int dim1, int dim2);
}

class Bronko implements Gen2d
{
	int i = 7;
	
	public Object [][] generate (int dim1, int dim2)
	{
		Bronko [][] b = new Bronko [dim1][dim2];
		for (int i=0; i < dim1; ++i) 
		{
			for (int j=0; j < dim2; ++j) 
			{
				b [i][j] = new Bronko ();
			}
		}
		return b;
	}
}

class Zizi
{
	int i = 7;
	
	public static Zizi [][] generate (int dim1, int dim2)
	{
		Zizi [][] b = new Zizi [dim1][dim2];
		for (int i=0; i < dim1; ++i) 
		{
			for (int j=0; j < dim2; ++j) 
			{
				b [i][j] = new Zizi ();
			}
		}
		return b;
	}
}

public class A2Dfill
{
	public A2Dfill ()
	{
		int[][] feld  = new int[10][10];
		System.out.println (feld [4][7]);
		// dummy-Objekt:
		Bronko bronko = new Bronko ();
		Bronko [][] b = (Bronko [][]) bronko.generate (8, 11);
		System.out.println (b [4][7]);
		Bronko [][] b2 = (Bronko [][]) bronko.generate (18, 4);
		System.out.println (b2 [4][2]);
		Zizi [][] z = Zizi.generate (18, 4);
		System.out.println (z [4][2]);
	}
	
	public static void main (String args[])
	{
		new A2Dfill ();
	}
}

Wenn Du für jeden Typ nur eine solche Methode aufrufst kannst Du es natürlich genausogut an Ort und Stelle machen. Generierst Du für einen Typen viele 2d-Arrays, dann ist es vielleicht hilfreich.

Kommst Du an die Klasse nicht ran, so kannst Du eine Factoryklasse bauen, die die Generatoren bereitstellt.

Java-Generics helfen leider nicht weiter, weil man nicht new auf einem generischen Typen aufrufen kann:

1
2
3
4
5
6
7
8
public <T> generate (int x, int y) 
{
         T [][] t = new T [x][y];
// ...
         t[i][j] = new T (); 
// 
         return t;
}

Wenn die Typen alle Cloneable implementieren, dann kannst Du mit Reflection und clone vielleicht was reißen.

Antworten |