Java n-Dimensionoales int Array flatten

Split1989

hh-student.de
ID: 238425
L
9 April 2007
1.223
85
Moinsen,

bin gerade am üben und habe mich ein wenig verbissen. Versuche in Java ein beliebig verschachteltes Array platt zu hauen.

Habe das jetzt für ArrayList und für nicht primitive Datentypen hinbekommen.

Komme aber bei den primitiven Datentypen leider nicht weiter.

Hier meine 2 bisherigen Lösungen:

Code:
public static ArrayList flatten(Object[] arr) {
        ArrayList res = new ArrayList();
        for (int i = 0; i < arr.length; i++) {

            if (arr[i] instanceof Object[]) {
                res.addAll(flatten((Object[]) arr[i]));
            } else {
                res.add(arr[i]);
            }
        }

        return res;

    }

    static List flatten(List list) {

        ArrayList res = new ArrayList();

        for (int i = 0; i < list.size(); i++) {

            if (list.get(i) instanceof List) {
                res.addAll(flatten((List) list.get(i)));
            } else {
                res.add(list.get(i));
            }
        }

        return res;
    }

habt ihr eine Tipp für mich?
 
flatten -> plattpflopfen


BSP 1.
arr = [1,2,[1,2],1,[1,[1,2],3]]

Array.flatten(arr) -> [1,2,1,2,1,1,1,2,3]

BSP 2.

arr = [[1,2],[3,4]]

Array.flatten(arr) -> [1,2,3,4]


also das n dimensionale array in ein 1 dimensionales umwandeln.

Wichtig in meinem fall das das ganze für

int[][]..... geht


für Integer[] geht das ja bereits mit meiner function die Object[] als input erwartet (aber halt leider nicht mit primitiven datentypen)
 
Komme aber bei den primitiven Datentypen leider nicht weiter.
Ersetze Object durch int, float, double, long, boolean, je nach Datentyp eben.
(Über Sinn und Unsinn müssen wir ja nicht diskutieren, wenn du das nur als Übung machen willst)

Ein primitiver Datentyp ist kein Objekt, also passt Object auch nicht.
 
würde man in structorierten Programmiersprachen eine strikte Typdefinition weglassen, wäre es einfacher, so wie in PHP.
Alles ist ein Object, egal ob Int, Boolean, String ...
Dann würde dies sogar jetzt schon funktionieren, aber dies rührt aus der Zeit, als es nicht genug Arbeitsspeicher gab, und jedes Byte(Bit) gezielt geplant werden musste ...

Leider :ugly:
 
Ersetze Object durch int, float, double, long, boolean, je nach Datentyp eben.
(Über Sinn und Unsinn müssen wir ja nicht diskutieren, wenn du das nur als Übung machen willst)

Ein primitiver Datentyp ist kein Objekt, also passt Object auch nicht.

Alternativ vllt auch Generics arbeiten und mit unbekannten Typen a la <T> arbeiten?
 
Alternativ vllt auch Generics arbeiten und mit unbekannten Typen a la <T> arbeiten?
Womit sich der Kreis von Java wieder schließt, da du eine Primitive nicht mit Generics verwenden kannst. T muss eine Klasse sein und int ist nun mal keine Klasse, sondern nur Integer, also wieder ein Objekt.
 
Aber hier würde das automatische Casten greifen, so dass ein int zu einem Integer wird und umgedreht. Man könnte an der Stelle also schon mit Generics arbeiten, hat aber eben einen gewissen Overhead da dauerhaft zwischen Objekt und primitiven Datentyp gecastet werden muss (der in der Anwendung aber vermutlich vernachlässigbar sein wird).