Array-Liste nur einmal ausgeben


Xerif

Grünschnabel
#1
Hallo ich will das die Array-Liste zufällig ausgegeben wird, aber jedes Tier soll nur ein einziges mal ausgegeben werden.
Code:
package x;
import java.util.Random;
public class ausgabe {

public static void main(String[] args){
String[] liste = { "Katze", "Hund", "Maus"};
Random b = new Random();

for(int r=0;r<3; r++){
int a = b.nextInt(2)+1;
System.out.println(liste[a]);
    }}
}
Könnte mir vllt einer helfen? MfG
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#2
Hi,

ich sehe keine ArrayList, dein Titel ist etwas irreführend. Du willst konkret ein Array unsortiert ausgeben.
In deinem Code hast du übrigens noch einen Fehler drin, das Element an der ersten Stelle ("Katze") wird nie ausgegeben.
Rätsel an dich:
* Warum wird Katze nie ausgegeben?
* Warum hast du dann bei obigen Code immer nur maximal 2 Ausgaben?

Als Lösung für dein geschildertes Problem:
1. Ein zusätzliches Set mit den bisher bereits ausgegeben Elementen:
Java:
package x;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class AusgabeSet {
    public static void main(String[] args) {
        String[] liste = {"Katze", "Hund", "Maus"};
        Set<String> used = new HashSet<>();
        Random b = new Random();

        do {
            int a = b.nextInt(liste.length);
            if (used.add(liste[a])) {
                System.out.println(liste[a]);
            }
        } while (used.size() < liste.length);
    }
}
Durch die Verwendung von Random werden aber bestimmte Indices öfters getroffen, sprich die Schleife läuft nicht nur 3x sondern kann theoretisch auch 10x laufen.

2.1 Mit Hilfe der Collections- und Array-Klassen:
Java:
package x;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class AusgabeShuffle {
    public static void main(String[] args) {
        String[] elemente = {"Katze", "Hund", "Maus"};
        List<String> tmpList = Arrays.asList(elemente);
        Collections.shuffle(tmpList);
        for (int r = 0; r < elemente.length; r++) {
            System.out.println(tmpList.get(r));
        }
    }
}
Vorteil hier wäre, dass jedes Element exakt einmal getroffen wird. Des weiteren ist das "würfeln" in Java ziemlich effizient und macht genau das was du willst.

2.2 Geht auch noch kürzer mit Java8-Lambdas:
Java:
package x;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class AusgabeShuffle {
    public static void main(String[] args) {
        String[] elemente = {"Katze", "Hund", "Maus"};
        List<String> tmpList = Arrays.asList(elemente);
        Collections.shuffle(tmpList);
        tmpList.forEach(System.out::println);
    }
}
Wie 2.1, jedoch noch weniger Code dank einer Methodenreferenz zur Ausgabe.

Grüsse,
BK
 

melmager

Erfahrenes Mitglied
#3
läuft alles unter dem Suchbegriff shuffel :)

Code:
List<String> list = Arrays.asList("Katze", "Hund", "Maus");
Collections.shuffle( list );

System.out.println( list );
ist eine Möglichkeit

code > untested
edit:
mist zu langsam :)