String ArrayList ohne Wiederholungen

noborders

Mitglied
Hey ich hätte da nochmal eine Frage. Ich will eine ArrayList zufällig ausgeben lassen und die ausgegebene Zeile soll aus dem Array gelöscht werden, dass es keine Wiederholungen gibt. Das hat auch geklappt nur in der ausgabe bleiben dann die Zeilen leer anstatt ne neue Zahl zu generieren die es noch nicht gibt. Das hab ich bis jetzt:

Java:
//....
       if(songAnzahl == b){
                        try {
           final JFrame fertigeSetlist2 = new JFrame();
           fertigeSetlist2.setLayout(null);
           fertigeSetlist2.setSize(700,700);
          // fertigeSetlist2.setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
           
           
           fertigeSetlist2.setTitle("songAnzahl()- Slider");
           fertigeSetlist2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           fertigeSetlist2.setVisible(true);
           fertigeSetlist.setVisible(false);
           
           
           
         
           
           
           JButton backButton = new JButton ("Zurück");
           backButton.setBounds(50, 580, 150, 50);
           fertigeSetlist2.add(backButton);
           backButton.addActionListener(new ActionListener(){

               @Override
               public void actionPerformed(ActionEvent arg0) {
                   
                   songAnzahl();
                   
                   fertigeSetlist2.setVisible(false);
                   
               }
           });
           
           ArrayList<String> songs = new ArrayList<String>();
           
           
           
           String line;
           
           BufferedReader inReader = new BufferedReader(new FileReader("Lieddatei.txt"));
           
           int rand;
           
           Random r = new Random();
           
            System.out.println("Wiederholungen müssen noch verhindert werden");

          
          while((line = inReader.readLine())!= null){
              songs.add(line);
          }
         
           
      
           
           
          String[] sSong = (String[])songs.toArray(new String[0]);
          
                if (sSong.length == 0){
                   
               
          JOptionPane.showMessageDialog(null, " Du musst zuerst Lieder hinzufügen! ","Error", JOptionPane.ERROR_MESSAGE);
         
                }
                
                
       
          for(int i=0; i<b;i++){
            rand= r.nextInt(sSong.length);
            
            
        //boolean listeVoll = false;
        
              for(Iterator<String> iterator = songs.iterator();iterator.hasNext();){
               String a = iterator.next();
               if(a.equals(sSong[rand])){
               iterator.remove();
                   
               
               
               
               JLabel label = new JLabel(sSong[rand]); 
              //JLabel label = new JLabel(sSong[rand]);
              
              
              
              label.setBounds(250, i*20, 400, 100);
              label.setLayout(null);
              fertigeSetlist2.add(label);
               }
                        };
Danke schonmal für die Hilfe 🙂
 
Ups ... also ich will ja dass die Strings nicht doppelt ausgeben werden. Klappt auch aber da wo eigentlich dann eins auftaucht was schon vorhanden ist, ist der Platz dann leer. Deshalb versuch ich, dass dann ne neue Zufallszahl erzeugt wird, um dann den Platz zu füllen bzw halt den doppelten String dadurch zu ersetzen. Die Frage ist halt wie ich das am besten hinkrieg weil wenn ich nochmal ne random Zahl erzeugen lass, überlappen sich die Strings im Label.
Aber danke für die schnelle Antwort und ich hoff dass es verständlich war was ich mein 🙂
 
Hallo noborders,

soweit ich das jetzt nachvollziehen kann, liest du eine Setlist zeilenweise aus einer Datei ein und speicherst das Ergebnis in einer ArrayList. Dabei kann es vorkommen, dass manche Titel doppelt auftreten. Sehe ich das richtig so?

In diesem Fall empfehle ich eher ein Set anstatt einer List, da es dort keine Duplikate gibt, falls sich Einträge gleichen sollten.

Damit bist du einmal das Problem mit den doppelten Einträgen los. :toll:

Bezüglich der Zufallsauswahl gibt es die Methode

Java:
Collections.shuffle(List<?> list);

Nachdem du für den Aufruf aber wieder eine List brauchst, machst du im Prinzip folgendes:

Java:
Set<String> songs = new HashSet<String>();

// ... befuellen ...

List<String> randomSongs = new ArrayList<String>(songs);

// everyday I'm shuffeling
Collections.shuffle(randomSongs);

for(String song : randomSongs)
{
       // ...
}

Sollte das liefern was du brauchst, bin für Rückfragen offen.
 
Hey danke für die Antworten 🙂. Hat funktioniert. Jetzt hät ich noch eine Frage dazu. Ich hab die Int variable songAnzahl, die den Wert von nem Slider wieder gibt. Wie krieg ich das jetzt hin dass das "Set" nur die Menge ausgibt wie "SongAnzahl" groß ist? (war das verständlich? 😀 ) und danke nochmal hat voll weitergeholfen
 
Da gibts mehrere Möglichkeiten.

1.

Java:
int songAnzahl = 42;

for(int i = 0; i < songAnzahl; i++)
{
    String song = randomSongs.get(i);

    // ...
}

2.

Java:
int songAnzahl = 42;
int i = 0;

for(String song : randomSongs)
{
    if(i > songAnzahl)
        break;
    
    // ...

    i++;
}

Bedenke, dass Möglichkeit 1 zu einer ArrayIndexOutOfBoundsException führt, wenn songAnzahl > randomSongs.size() ist. Bin mir sicher du schaffst es das abzufangen 😉
 

Zurück
Oben