# Zweit kleinstes im Array ausgeben



## Korsakoff (24. Okt 2018)

Hallo,

ich hab ein kleines Problem, und zwar soll ich aus einem Array das zweit kleinste Minimum ausgeben. An sich funktioniert das auch, allerdings nur, wenn nicht eine Zahl mehrfach vorkommt.
Die Zahlen im Array sind vorgegeben: {2,10,4,2,6,4}
Ich hab es auch mit dem zweit größten Maximum versucht, auch da geht es nicht, ist ja (fast) das gleich wie das zweit kleinste Minimum auszugeben.

Hier mein Code:

```
int [] a = {2,10,4,2,6,4}
int min = a[0];
        int min2 = a[1];
        for (int i = 1; i < a.length; i++) {
            if (a[i] < min) {
                min2 = min;
                min = a[i];
            }
            else if (i < min2) {
                min2=a[i];               
            }
```
Als Ausgabe bekomme ich immer die kleinste Zahl.
Vllt kann mir einer von euch, einen kleinen Tipp geben?


----------



## mihe7 (24. Okt 2018)

Sortier das Array aufsteigend und nimm das zweite Element...


----------



## Korsakoff (24. Okt 2018)

Das kann ich natürlich machen.
Aber ich möchte/soll es ohne sortieren machen...


----------



## Robat (24. Okt 2018)

mihe7 hat gesagt.:


> Sortier das Array aufsteigend und nimm das zweite Element...


War auch mein erster Gedanke. Würde aber nicht funktionieren, weil die 2 zB doppelt vorhanden ist.

Mit Java 8 und Streams geht das ganze recht simpel. Weiß aber nicht ob ihr die benutzen dürft / du sie benutzen willst.

```
int[] data = { 2, 2, 2, 2};

int minimum = Arrays.stream(data).min().getAsInt();
int secondMinimum = Arrays.stream(data).filter(e -> e > minimum).min().orElse(minimum);

System.out.println(secondMinimum);
```
Die Idee kannst du aber auch wunderbar auf deine "händische" Lösung übertragen. Such erst nach dem Minimum und danach nach dem zweiten Minimum, welches größer als dein "echtes" Minimum ist.

Edit: Code noch mal kurz abgeändert, um auch den Spezialfall "alle Zahlen gleich" abzudecken {2, 2, 2, 2}


----------



## mihe7 (24. Okt 2018)

Robat hat gesagt.:


> War auch mein erster Gedanke. Würde aber nicht funktionieren, weil die 2 zB doppelt vorhanden ist.


Oh Mann mihe, Hirn einschalten.


----------



## Robat (24. Okt 2018)

mihe7 hat gesagt.:


> Oh Mann mihe, Hirn einschalten


Naja an sich ist ja der Gedanke nicht schlecht. Duplikate entfernen, aufsteigend sortieren, zweites Element nehmen. Wäre auch eine Möglichkeit


----------



## mihe7 (24. Okt 2018)

Ja, mir ging es darum, dass ich ihn genau andersrum verstanden hatte und das, obwohl es ziemlich eindeutig drinsteht  Lösungsmöglichkeiten gibt es mehr als genug.


----------



## Robat (24. Okt 2018)

mihe7 hat gesagt.:


> obwohl es ziemlich eindeutig drinsteht


Da hilft nur Kaffee


----------



## mrBrown (24. Okt 2018)

Ich finde ja, sortieren und dann das zweite nehmen, ist auch eine richtige Interpretation der Aufgabe


----------



## mihe7 (24. Okt 2018)

@Robat so viel Kaffe müsste erst noch angebaut werden, damit das hilft.
@mrBrown hmm... dann lassen wir das überflüssige O(nlogn)-Sortieren weg und lösen wir die Aufgabe in O(1): nimm einfach das zweite.


----------



## mrBrown (24. Okt 2018)

mihe7 hat gesagt.:


> @mrBrown hmm... dann lassen wir das überflüssige O(nlogn)-Sortieren weg und lösen wir die Aufgabe in O(1): nimm einfach das zweite.


Das hat ja nichts mehr mit Minimum zu tun 

Ein Graph kann ja auch zwei gleiche Minima haben...von daher fände ich das hier auch okay 



Robat hat gesagt.:


> Mit Java 8 und Streams geht das ganze recht simpel. Weiß aber nicht ob ihr die benutzen dürft / du sie benutzen willst.
> 
> ```
> int minimum = Arrays.stream(data).min().getAsInt();
> ...




```
Arrays.stream(data).distinct().sorted().limit(2).reduce(Integer::max)
```


----------



## mihe7 (24. Okt 2018)

mrBrown hat gesagt.:


> Das hat ja nichts mehr mit Minimum zu tun


Tja, das kommt jetzt auf die Definition von "das zweite" an 



mrBrown hat gesagt.:


> ```
> Arrays.stream(data).distinct().sorted().limit(2).reduce(Integer::max)
> ```



Ich protestiere: das ist zu einfach.


----------



## fhoffmann (24. Okt 2018)

So hübsch Streams sind; hier geht es offensichtlich um eine Anfängerfrage; und als solcher sollte man üben, derartige Programme selber zu schreiben.
Robat hat es bereits angedeutet: Man kann zuerst das Minimum aller Zahlen im Array ermitteln; im zweiten Schritt ermittelt man dann das Minimum aller Zahlen, die größer sind als das erste Minimum. Ein Code könnte folgendermaßen aussehen (wobei ich das Ermitteln des zweiten Minimums weggelassen habe - das war ja die Übung):

```
public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.testArr();
    }

    public void testArr() {
        int[] arr = {2, 10, 4, 2, 6, 4};
        int min1 = min(arr);
        System.out.println(min1);
        int min2 = minGreaterThan(arr, min1);
        System.out.println(min2);
    }

    public int min(int[] arr) {
        int min = arr[0]; // Integer.MAX_VALUE
        for(int i = 1; i < arr.length; i++) {
            if(arr[i] < min) {
                min = arr[i];
            }
        }
        return min;
    }

    public int minGreaterThan(int[] arr, int greaterThan) {
        return 42; // TODO
    }
}
```


----------



## Robat (24. Okt 2018)

mrBrown hat gesagt.:


> ```
> Arrays.stream(data).distinct().sorted().limit(2).reduce(Integer::max)
> ```


Wir wollen doch so wenig Zeichen wie möglich haben! 

```
Arrays.stream(data).distinct().sorted().limit(2).max();
```

PS: @Korsakoff nimm dir den Ratschlag von @fhoffmann zu Herzen. Mit Streams solltest du diese Aufgabe wirklich nicht lösen


----------



## Korsakoff (25. Okt 2018)

Vielen Dank an euch alle 
ich hab da mit dem sortieren versucht und das hat auch geklappt.
Den Weg wie es fhoffmann gemacht habe, werde ich auch nochmal probieren.
Danke euch =)


----------

