Methode für tiefe Kopie eines unbekannt (dimensionierten & typisierten) Feldes realisierbar?

Complexus

Mitglied
Mahlzeit,

ich möchte eine Methode schreiben, welche den Übergabeparameter eines generischen Typs zu erst darauf prüft, ob es sich dabei um ein Feld handelt. Ist dem nicht so, wird eine Ausnahme geworfen.

Wenn es sich bei dem generischen Typ um ein Feld handelt, so ist die Dimension des Feldes zu bestimmen und dann entsprechend eine tiefe Kopie anzulegen.

Der Anfang ist schnell gemacht:

Java:
...

	public static <Feld> Feld tiefeFeldkopie(Feld feld) throws Exception{
		
		String klassentyp = feld.getClass().toString();
		int dimension = 0;
		Feld feldkopie = null;
		
		for(int z = 6; klassentyp.charAt(z) == '['; z++, dimension++){}
		
		System.out.println(dimension);
		
		if(dimension == 0){
			throw new Exception("Kein Feld!");
			
		}else{
			
			// ? 
			
		}
		
		return feldkopie;
		


...

Ist mein Vorhaben realisierbar?

1.)
Um der Komplexität der unbekannten Dimensionierung Herr zu werden, sind doch eigentlich die gleiche Anzahl Schleifen erforderlich, wie Anzahl der Dimensionen des Feldes.

2.)
Wie lässt sich eine Dimension eines vermeintlich generischen Typen ansprechen.

3.)
Wie lässt sich überhaupt ein Feld eines generischen Typen initialisieren?

4.)
Eine Methode "clone()" müsste dem unbekannten generischem Typen beiliegen. Wie lässt sie sich aufrufen?


Im Moment bin ich mir sicher, dass dieses Vorhaben nicht möglich ist. Ich hoffe ihr könnt mich vom Gegenteil überzeugen.
 

Natac

Bekanntes Mitglied
Was ist denn bei dir ein "Feld"? Ist das eine eigene Klasse? Und was meinst du mit "generischen Typ"?

Die Klasse Class (wovon du mit getClass() eine Instanz bekommst), hat Methoden um mit Feldern und Methoden umzugehen. Tipp:
Java:
getClass().getDeclaredFields()
Das über die String-Repräsentation lösen zu wollen ist eine ganz doofe Idee. Ich denke, du solltest einen Blick in die Dokumentation werfen. :rtfm:

Was verstehst du unter "Dimension"? Ist alles 0-dimensional, was kein Array ist? Sind einfacher Arrays 1-dimensional und alles weiter dann eben "höher"-dimensional!? Ich kenne wohl ein 2- , 3- oder auch 4-fach dimensionales Array, aber was die "Dimension eines Feldes" sein soll, ist mir schleierhaft :bahnhof:.
 
Zuletzt bearbeitet:

Complexus

Mitglied
Mein Beitrag ist leider nicht mehr änderbar, sonst hätte ich die notwendige Ergänzung hinzugefügt.

"Feld" ist der deutsche Begriff für "Array". Was die Dimension angeht:

Java:
Object[]      object_feld;      // 1D
Object[][]    object_feld;      // 2D
Object[][]... object_feld;      // xD
 

Natac

Bekanntes Mitglied
Okay... Aber niemand sagt "Feld". Es heißt (auch im deutschen) eigentlich "Array". Ein Feld ist bei mir höchstens sowas:
Java:
public class MyClass{
  private String feld;
  //...
}

Deine Aufgabe lautet also ein Array beliebiger Tiefe zu kopieren. Ich denke das kann man ein wenig zerlegen:

1.) Wie legst du ein neues Array an, wenn du bereits ein Array vom gleichen Typ hast?
2.) Wie erkennst du, ob ein Object ein Array ist?

Wenn du diese beiden Fragen geklärt hast, könnte man anfangen folgende Pseudo-Code zu realisieren:
Code:
Object kopiere(Object o){
  if(o ist array){
     n = neues Array vom selbem typ
     für alle elemente aus o{ // kopiere alle Elemente
       n[i] = kopiere(o[i]); // rekursiver Aufruf
     }
     gib n zurück
  }
  else{
     gib o zurück // ist kein Array und muss nicht kopiert werden
  }
}

Eigentlich gibt es "Mehrdimensionale"-Array als solche nicht (also es ist kein Extratyp, der von Java irgendwie gesondert behandelt wird, auch wenn es eine spezielle Notation dafür gibt).
Es gibt immer nur ein Array, das eben Objekte beinhaltet. Diese können weitere Arrays sein, müssen es aber nicht. Ziel muss es also sein zu erkennen, ob es ich um ein Array handelt und dieses dann zu kopieren. Ist ein Objekt kein Array, muss es auch nicht kopiert werden.

Ich hoffe ich konnte dir mit diesem Ansatz weiterhelfen.
 
Zuletzt bearbeitet:

Complexus

Mitglied
Die Erkennung, ob ein Objekt ein Array ist oder nicht, liefert uns der Rückgabewert der Methode
Code:
getClass().isArray()
.

Nun bleiben zwei Fragen zu klären:
1.) Wie legst du ein neues Array an, wenn du bereits ein Array vom gleichen Typ hast?

Dafür gibt es zwei Lösengswege, bzw. nur einen, der funktioniert.

Java:
Object o[] = new Object[1];

// Erster Weg, der nicht funktioniert

Object o_kopie[] = o.getClass().newInstance(); // Liefert InstantiationException; wahrscheinlich, weil die Breite nicht bekannt ist

// Zweiter Weg, der funktioniert

Object o_kopie[] = o.clone();

2.) Wie kann ich einen generischen (unbekannten) Typ als Array behandeln, bzw. casten?

Java:
public static <A> void funktion(A array){

	A array_kopie = null;

	if(array.getClass().isArray()){
		array_kopie = array.clone(); // *Fehler
	}		

}

Der Compiler weiß zu diesem Zeitpunkt noch nicht, um welches Objekt es sich bei
Code:
<A>
handelt. Folglich gibt es keine
Code:
clone()
Methode. Wie muss ich die Variable
Code:
array
casten?
 

Natac

Bekanntes Mitglied
Java:
A[] array = (A[]) Array.newInstance(Class<A> type, int length)
Ist die Lösung, die ich im Kopf hatte.
 
Zuletzt bearbeitet:

Complexus

Mitglied
Java:
A[] array = (A[]) Array.newInstance(Class<A> type, int length)
Ist die Lösung, die ich im Kopf hatte.

Bei diesem Quelltext meldet Eclipse sofort einen Fehler und auch ich hätte gesagt, dass das so nicht funktionieren kann.
Code:
Array.newInstace(Class<?> componentType, int length)
verlangt doch schon einen konkreten Typ und dann doch einen generischen übergeben?
Und wie soll dann
Code:
componentType
oder gar
Code:
length
definiert werden? Dazu müsste man erstmal in der Lage sein, die Länge des übergebenen Arrays unbekannten Typs auszulesen.

Des weiteren ergibt
Code:
A[]
für mich keinen Sinn, da
Code:
A
ohne eckige Klammern bereits jeden Typ annehmen kann, also auch ein Array, was wir hier ja explizit wollen. Wenn nun
Code:
A
zum Beispiel den Typ
Code:
Object[]
annimmt, würde
Code:
A[]
gleich
Code:
Object[][]
bedeuten ...

Ich bin dir dennoch sehr dankbar, dass du im Moment der Einzige bist, der mir hier zu helfen versucht, auch wenn es im Moment noch nicht sehr fruchtet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
H FTP Befehl/Java Methode für Submit im z/Os (Host) Allgemeine Java-Themen 1
D Methode für generische enummap/enum Allgemeine Java-Themen 10
Meldanor finalize Methode überschreiben für .close() Allgemeine Java-Themen 5
H Generics für Methode Allgemeine Java-Themen 14
Screen Eine mathematische Funktion als Argument für eine Methode - Matheparser? Allgemeine Java-Themen 21
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
L Methode "Neues Spiel" für Memory Allgemeine Java-Themen 2
V 1 Methode für viele verschiedene Klassen? Allgemeine Java-Themen 9
E Existiert eine Methode für die Kalenderwochen im Jahr? Allgemeine Java-Themen 4
R keine sqrt methode für bigintegers? Allgemeine Java-Themen 14
0 Keine clone-Methode für BigDecimal und BigInteger? Allgemeine Java-Themen 3
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3
R Methode in Methode voraussetzen Allgemeine Java-Themen 8
S Überschriebene Methode der Oberklasse der Oberklasse aufrufen. Allgemeine Java-Themen 5
D Methode dynamisch aufrufen Allgemeine Java-Themen 2
Sogomn Methode als Parameter? Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
BRoll Methode abbrechen (Invoke von außen) Allgemeine Java-Themen 5
I Methode verallgemeinern (Methode als Parameter)? Allgemeine Java-Themen 10
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
G Threads Methode nebenbei ausführen, Status verarbeiten Allgemeine Java-Themen 4
M Fabrik Methode, gutes Beispiel? Allgemeine Java-Themen 0
M WebService - Zugriff auf Webservice Methode über Browser Allgemeine Java-Themen 1
N WaitForScript- methode in javafx Allgemeine Java-Themen 1
2 jede Stunde Methode ausführen Allgemeine Java-Themen 8
M Eine static-Methode verlassen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben