# Inhalte aus einem Array in eine Liste sortiert einfügen



## Hacer (27. Sep 2016)

Hallo zusammen,
Ich muss eine Methode sortiertEinfügen(Element[] data) implementieren, die alle Inhalte aus dem übergebenen Array aufsteigend nach der Länge der Liste sortiert in eine Liste einfügt. Es kann auch Zellen enthalten, die leer sind.
Ich habe keinen Plan wie ich solch eine Aufgabe lösen kann.


----------



## Joose (27. Sep 2016)

Aber einen Ansatz wirst du doch wohl haben oder?
Wie würdest du denn der Reihe nach vorgehen (wollen)?


----------



## Hacer (27. Sep 2016)

Ich würde das Array erstmal durchlaufen mit einer for-Schleife  und vielleicht überprüfen, ob es leere Zellen gibt, wenn ja diese entfernen??


----------



## Hacer (27. Sep 2016)

geht das vielleicht wenn man das Array erstmal da einfügt und dann sortiert, weil die Liste ja auch unsortiert sein könnte


----------



## Meeresgott (27. Sep 2016)

Ich würde erst das Array einer List Übergeben und mit dem Iterator dann alle Objekte der List durchgehen und wenn es ein "Leeres Objekt" (null) ist es dann entfernen.
Das sortieren kannst du danach machen mit einer List ist das recht einfach umzusetzen.

viele Grüße


----------



## Neumi5694 (28. Sep 2016)

Elemente aus dem Array entfernen geht natürlich nicht. Du kannst sie beim Durchlaufen höchstens überspringen.

Von Array -> Liste gibt's mehrere Möglichkeiten, z.b. Arrays.asList(...)
Danach gibt's auch wieder mehrere Möglichkeiten, die Null-Objekte aus der Liste zu entfernen, empfehlen würde ich list.removeAll(Collections.singleton(null))
Kommen mehrere Filter zum Zuge und nicht nur eine Nullprüfung, dann durchlaufe die Liste von hinten nach vorne per Index und entferne deine Kandidaten. Von hinten nach vorne deshalb, damit du kein Index-Problel kriegst, wenn du ein Element entfernst (und so ganz nebenbei musst du die Größe der Liste nur einmal für den Startwert des Index abfragen, das drückt die Ausführzeit nach unten). Verwende keine for-each Schleife, wenn du während einer solchen Elemente entfernst, dann kriegst du zurecht eine Exception.

Willst du modern arbeiten, dann streame dein Array und filtere die Elemente raus.

```
Arrays.stream(aaa).filter(aElement -> (/**Bedingung zum Weiterleiten, z.B. aElement != null**/)).collect(Collectors.toList());
```
Ich persönlich mag das nicht sonderlich, gerade im Vergleich zu Arrays ist ein Stream außerdem ziemlich langsam. Aber es ist nun mal der neue way-2-go.
Das Ding danach noch zu sortieren, sollte kein Problem sein, die Collections-Klasse bietet da vorgefertigte Funktionen. Du musst dich nur noch mit Comparatoren auseinandersetzen.


----------



## Xyz1 (28. Sep 2016)

Hacer hat gesagt.:


> aufsteigend nach der Länge der Liste sortiert in eine Liste einfügt.



hä? hä? Du hast doch ein Array `Element[]`. Auf was bezieht sich Länge der Liste? Auf was bezieht sich sortiert?

c, null, a ---- soll wie in eine Liste eingefügt werden?


----------



## Flown (28. Sep 2016)

@Hacer stell doch bitte mal die ganze Aufgabe hier rein.


----------



## Hacer (28. Sep 2016)

Hier ist die Aufgabe mit den dazugehörigen Codes. Und danke


----------



## Flown (28. Sep 2016)

Mit Länge der Inhalte ist die Länge des Strings im Payload gemeint nehm ich mal an oder?

Was hast du derweil für einen Ansatz?


----------



## Xyz1 (28. Sep 2016)

Bitteschön:
Absteigend:

```
import java.util.*;

/**
* @author
*/
public class JavaApplication5 {

    public static void main(String[] args) {
        SpaßMitListenUndMitArrays smluma = new SpaßMitListenUndMitArrays();
        smluma.sortiertEinfuegen(null);
        smluma.sortiertEinfuegen(new String[][]{});
        smluma.sortiertEinfuegen(new String[][]{{}});
        smluma.sortiertEinfuegen(new String[][]{null, {"sehr"}, {"kreativ", "sein"}, {"ist"}, {"das", "nicht", "immer"}, null});
        smluma.sortiertEinfuegen(new String[][]{{"hallo"}});
        smluma.sortiertEinfuegen(new String[][]{{"lang"}, {"wei"}, {}, {"lig"}});
        smluma.llsa.stream().forEach((strings) -> {
            System.out.println(Arrays.toString(strings));
        });
    }
}

class SpaßMitListenUndMitArrays {

    LinkedList<String[]> llsa = new LinkedList<>();

    void sortiertEinfuegen(String[][] data) {
        if (data == null || data.length == 0) {
            return;
        }
        Arrays.sort(data, (String[] o1, String[] o2) -> {
            if (o1 == null) {
                if (o2 == null) {
                    return 0;
                } else {
                    return +1;
                }
            } else if (o2 == null) {
                return -1;
            } else {
                return o2.length - o1.length; // aufpassen
            }
        });
        int i = 0, j = 0;
        while (i < data.length) {
            if (data[i] == null /* || data[i].length == 0 */) {
                return;
            }
            while (j < llsa.size() && data[i].length <= llsa.get(j).length) {
                j++;
            }
            llsa.add(j, data[i]);
            i++;
        }
    }
}
```


```
[das, nicht, immer]
[kreativ, sein]
[sehr]
[ist]
[hallo]
[lang]
[wei]
[lig]
[]
[]
```

Aufsteigend:

```
import java.util.*;

/**
* @author
*/
public class JavaApplication5 {

    public static void main(String[] args) {
        SpaßMitListenUndMitArrays smluma = new SpaßMitListenUndMitArrays();
        smluma.sortiertEinfuegen(null);
        smluma.sortiertEinfuegen(new String[][]{});
        smluma.sortiertEinfuegen(new String[][]{{}});
        smluma.sortiertEinfuegen(new String[][]{null, {"sehr"}, {"kreativ", "sein"}, {"ist"}, {"das", "nicht", "immer"}, null});
        smluma.sortiertEinfuegen(new String[][]{{"hallo"}});
        smluma.sortiertEinfuegen(new String[][]{{"lang"}, {"wei"}, {}, {"lig"}});
        smluma.llsa.stream().forEach((strings) -> {
            System.out.println(Arrays.toString(strings));
        });
    }
}

class SpaßMitListenUndMitArrays {

    LinkedList<String[]> llsa = new LinkedList<>();

    void sortiertEinfuegen(String[][] data) {
        if (data == null || data.length == 0) {
            return;
        }
        Arrays.sort(data, (String[] o1, String[] o2) -> {
            if (o1 == null) {
                if (o2 == null) {
                    return 0;
                } else {
                    return +1;
                }
            } else if (o2 == null) {
                return -1;
            } else {
                return o1.length - o2.length; // aufpassen
            }
        });
        int i = 0, j = 0;
        while (i < data.length) {
            if (data[i] == null /* || data[i].length == 0 */) {
                return;
            }
            while (j < llsa.size() && data[i].length >= llsa.get(j).length) {
                j++;
            }
            llsa.add(j, data[i]);
            i++;
        }
    }
}
```


```
[]
[]
[sehr]
[ist]
[hallo]
[lang]
[wei]
[lig]
[kreativ, sein]
[das, nicht, immer]
```

Das ist doch recht Umfangreich, aber besser geht s nicht. Dafür gibt s ne 1.


----------



## Hacer (28. Sep 2016)

also ich habe zwar einen Ansatz. Wollte dann die neue Liste, die entsteht einfach in die alte Liste einfügen und dies dann null setzen.

```
public void addSorted(Payload[] data){
     Element node =firstElement;
     List neueListe =new List();
    
     for(int i=0; i<data.length&&node!=null; i++){
               if(node.data[i]< node.getValue()){
                     neueListe.add(i);
}
}}
```


----------

