2 For schleife

Liegt in der Betrachtungsweise.
Ich will es nicht lesen *g*

Hast du dir schon mal überlegt eine Funktion zu schreiben, die als Kurzbefehl aufgerufen werden aknn und die dann das macht was du brauchst?
 
Ich hab es gelesen und darauf geantwortet ...
Es war nicht das was ich meine ;)

Wenn ich ein zweidimensionales int-array hab fänd ichs gut direkt auf die ints zugreifen zu können, anstatt erst auf die eindimensionalesn Arrays.

Auslagern wär für sowas glaub ich unübersichtlich, wenn mal ein andrer Programmierer drauf schauen will. Bzw. braucht man das ja auch nicht so oft denk ich mal.

Wie Zeja ja schon gesagt hat, muss ich das Array ersma auspacken und das ganze kürzer zu schreiben ändert daran ja nichts.
 
Nun, mit einer eigenen Funktion ist sowas schon machbar.

Hab mal auf die schnelle was zusammengestiefelt

Die Funktion (zb. in einer Util-Klasse)
Java:
public class MyUtils{
    public static <T> T[] getAsSingleArray(final T[][] array){
        final List<T> list = new ArrayList<T>();
        for (T[] items: array){
            for (T item: items){
                list.add(item);
            }
        }
        return list.toArray(array[0]);
    }
}

Die Anwendung. Es geht mit dem generischen Ansatz aber nur mit Objecten, alos Integer anstelle von int
Java:
    public void testSingleArray(){
        final Integer[] array1 = {11,12,13,14};
        final Integer[] array2 = {21,22,23,24};
        final Integer[] array3 = {31,32,33,34};
         
        final Integer[][] twoDim =  {array1, array2, array3};

        // der gekürzte Aufruf
        for (Integer item: MyUtils.getAsSingleArray(twoDim)){
            System.out.println(item);
        }
    }

Nachtrag:
Die Funktion lässt sich mMn noch schöner machen:
Java:
    public static <T> T[] getAsSingleArray(final T[][] array){
        final List<T> list = new ArrayList<T>();
        for (T[] items: array){
            list.addAll(Arrays.asList(items));
        }
        return list.toArray(array[0]);
    }
 
Zuletzt bearbeitet von einem Moderator:
Erstmal danke für die Mühe auch wenns nicht unbedingt nötig gewesen wär ;)

Aber da dus nun gemacht hats hab ich mich mit dem Code mal ein bisschen auseinander gesetzt und Probleme mit den Wrapper Konvertierungen bekommen. Denn wenn ich das als Util ma benutzen will würde ich eher davon ausgehen, dass ich primitive Datentypen benutzten werde.

Also int[][] rein und int[] raus. Soweit geht das Java Autoboxing dann nämlich nicht. Ich habe den Code mal auf ints umgetrimmt, aber bei addAll und toArray gibt es dann Errors. <Integer> List und int Array passen nicht. Ich könnt nartürlich in der Methode manuell hin und herkonvertieren, aber da würde ich die herkömmliche 2 for Schleifen Methode bevorzugen.

Grüße
 
Das ist das Problem der primitiven Datentypen. Sie sind primitiv und alle generischen Methoden können nicht mit ihnen arbeiten. so auch der addAll, die ArrayList etc.

Es ist umsetzbar. Jedoch ergibt sich dadurch ein zu komplexer Code, der sich nicht lohnt für das was er ablösen sollte.

Java:
    private static int[] getAsSingleArray(final int[][] array){
        int length = 0;        
        for (int[] items: array) length += items.length;

        final int[] list = new int[length];
        int i = 0;
        
        for (int[] items: array){
            for (int item: items){
                list[i++] = item;
            }
        }
        return list;
    }

Darum verwende ich selten Arrays sondern lieber Listen und primitiva Typen nur im kleinen Umfeld, da mich sich damit viele Möglichkeiten verbaut.
 

Neue Beiträge

Zurück