Zweit kleinstes im Array ausgeben

Korsakoff

Mitglied
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:
Java:
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? :)
 
Zuletzt bearbeitet von einem Moderator:

Robat

Top Contributor
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.
Java:
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}
 
Zuletzt bearbeitet:

mihe7

Top Contributor
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.
 

mihe7

Top Contributor
@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

Super-Moderator
Mitarbeiter
@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 :p

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

Mit Java 8 und Streams geht das ganze recht simpel. Weiß aber nicht ob ihr die benutzen dürft / du sie benutzen willst.
Java:
int minimum = Arrays.stream(data).min().getAsInt();
int secondMinimum = Arrays.stream(data).filter(e -> e > minimum).min().orElse(minimum);
Java:
Arrays.stream(data).distinct().sorted().limit(2).reduce(Integer::max)
:p
 

fhoffmann

Top Contributor
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):
Java:
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

Top Contributor
Java:
Arrays.stream(data).distinct().sorted().limit(2).reduce(Integer::max)
:p
Wir wollen doch so wenig Zeichen wie möglich haben! :D:p
Java:
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

Mitglied
Vielen Dank an euch alle :D
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 =)
 

Neue Themen


Oben