Forum: PC-Programmierung Java zweidimensionales Object Array anlegen aber zur Laufzeit definieren


von Holger (Gast)


Lesenswert?

Moin,

folgenden Code-Schnipsel habe ich von 
http://docs.oracle.com/javase/tutorial/uiswing/components/table.html 
entnommen:
1
Object[][] data = {
2
    {"Kathy", "Smith",
3
     "Snowboarding", new Integer(5), new Boolean(false)},
4
    {"John", "Doe",
5
     "Rowing", new Integer(3), new Boolean(true)},
6
    {"Sue", "Black",
7
     "Knitting", new Integer(2), new Boolean(false)},
8
    {"Jane", "White",
9
     "Speed reading", new Integer(20), new Boolean(true)},
10
    {"Joe", "Brown",
11
     "Pool", new Integer(10), new Boolean(false)}
12
};

Nun ist die Struktur klar: String String String Integer Boolean.


Wie kann das Objekt data aber zur Laufzeit anlegen. Z.B. wenn ich String 
Integer Boolean brauche.

Und wie kann ich es dann mit Daten befüllen?


Gruß
Holger

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Holger schrieb:
> Wie kann das Objekt data aber zur Laufzeit anlegen. Z.B. wenn ich String
> Integer Boolean brauche.
Das array *wird*" zur Laufzeit angelegt...

> Und wie kann ich es dann mit Daten befüllen?
Genauso wie oben oder z.B. data[x][y] = "Bla"

Schreib doch mal lieber das Problem so wird man da nicht schlau draus...

von A. V. (kra5h)


Lesenswert?

Hallo Holger,

so etwas würde ich über Listen machen.
z.B.:

1.) einen Enum nutzen um die unterschiedlichen Objekttypen zu erkennen:
1
public enum MyTypes{
2
  NONE,
3
  TYPE1,
4
  TYPE2,
5
  TYPE3
6
}

2.) ein Interface basteln, welches dann deine Objecte nutzen
1
public interface IMyTypes {
2
  public MyTypes getMyType();
3
  }

3.) die verschiedenen Klassen erstellen. z.B.:
1
public class MyObjectType1 implements  IMyTypes{
2
  public MyTypes getMyType(){
3
    return MyTypes.TYPE1; 
4
  }
5
6
  public String String1, String2, String3;
7
  public int Integer1;
8
  public boolean Boolean1;
9
10
  public MyObjectType1(){
11
    this.String1 = "";
12
    this.String2 = "";
13
    this.String3 = "";
14
    this.Integer1 = 0;
15
    this.Boolean1 = false;
16
  }
17
  
18
  public MyObjectType1(String String1,String String2,String String3, int Integer1, boolean Boolean1){
19
    this.String1 = String1;
20
    this.String2 = String2;
21
    this.String3 = String3;
22
    this.Integer1 = Integer1;
23
    this.Boolean1 = Boolean1;
24
  }
25
}
26
27
28
public class MyObjectType2 implements  IMyTypes{
29
  public MyTypes getMyType(){
30
    return MyTypes.TYPE2; 
31
  }
32
33
  public String String1;
34
  public int Integer1;
35
  public boolean Boolean1;
36
37
  public MyObjectType2(){
38
    this.String1 = "";
39
    this.Integer1 = 0;
40
    this.Boolean1 = false;
41
  }
42
  
43
  public MyObjectType2(String String1, int Integer1, boolean Boolean1){
44
    this.String1 = String1;
45
    this.Integer1 = Integer1;
46
    this.Boolean1 = Boolean1;
47
  }
48
}
49
50
51
public class MyObjectType3 implements  IMyTypes{
52
  public MyTypes getMyType(){
53
    return MyTypes.TYPE3; 
54
  }
55
56
  public String String1, String2;
57
  public int Integer1, Integer2;
58
  public float Float1;
59
60
  public MyObjectType3(){
61
    this.String1 = "";
62
    this.String2 = "";
63
    this.Integer1 = 0;
64
    this.Integer2 = 0;
65
    this.Float1 = 0.0F;
66
  }
67
  
68
  public MyObjectType3(String String1, String String2, int Integer1, int Integer2, float Float1){
69
    this.String1 = String1;
70
    this.String2 = String2;
71
    this.Integer1 = Integer1;
72
    this.Integer2 = Integer2;
73
    this.Float1 = Float1;
74
  }
75
}

4.) alle Ojekte, deiner Klassen MyObjectTypeX in eine Liste packen und 
dann damit arbeiten. Z.B.:
1
import java.util.ArrayList;
2
import java.util.List;
3
4
public class MainClass {
5
  public static void main(String[] args){
6
    List<IMyTypes> MyObjects = new ArrayList();
7
    
8
    // dynamisches hinzufügen verschiedener KlassenTypen
9
    MyObjects.add(new MyObjectType1());
10
    MyObjects.add(new MyObjectType2());
11
    MyObjects.add(new MyObjectType3());
12
    
13
    // dynamisches hinzufügen verschiedener KlassenTypen mit Werten über den überladenen Constructor
14
    MyObjects.add(new MyObjectType1("Kathy", "Smith", "Snowboarding", 5, false));
15
    MyObjects.add(new MyObjectType2("Kathy", 5, false));
16
    MyObjects.add(new MyObjectType3("Kathy", "Smith", 5, 3, 2.0F));
17
    
18
    // Löschen eines Elements
19
    MyObjects.remove(0);
20
    MyObjects.remove(new MyObjectType2("Kathy", 5, false));
21
    
22
    // Arbeiten mit den Elementen
23
    for (int i = 0; i < MyObjects.size(); i++){
24
      switch (MyObjects.get(i).getMyType()){
25
        case NONE: break;
26
        case TYPE1: {
27
          
28
          // ---- z.B.:
29
          MyObjectType1 object1 = (MyObjectType1)MyObjects.get(i);
30
          String a = object1.String1;
31
          String b = object1.String2;
32
          int c = object1.Integer1;
33
          // irgendetwas mit a, b, c machen
34
          // ---- 
35
          
36
          break;
37
        }
38
        case TYPE2: break;
39
        case TYPE3: break;
40
        default: break;
41
      }
42
    }
43
  }
44
}

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

A. V. schrieb:
> so etwas würde ich über Listen machen

1) Hilft ihm das nicht wenn der Konstruktor ein Object[][] erwartet...
2) hat der TE das hoffentlich nach fast 4 Monaten gelöst bekommen ;-)

von A. V. (kra5h)


Lesenswert?

Läubi .. schrieb:
> 1) Hilft ihm das nicht wenn der Konstruktor ein Object[][] erwartet...

Ja, dass würde sicher reichen. Aber mit eigenen Klassen weiß man was wo 
liegt, statt ein "unbekanntes" Object-Array zu haben. Finde ich 
zumindest.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.