Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Ich möchte einen Land Generator erstellen, der mir ein Zufälliges Land rausspuckt. Das hab ich soweit geschafft. Problem ist, ich will, dass das Land nur einmal vorkommt. Manchmal kommt es vor, dass ein Land in der Liste doppelt vorkommt.

Empfohlene Antworten

Veröffentlicht

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

public class Land {
    public static void main(String[] args){
        String[] land = {"Albanien", "Andorra", "Belarus", "Belgien", "Bosnien und Herzegowina", "Bulgarien", "Dänemark", "Deutschland", "Estland", "Finnland", "Frankreich", "Griechenland", "Irland", "Island", "Italien", "Kosovo", "Kroatien", "Lettland", "Liechtenstein", "Litauen", "Luxemburg", "Malta", "Moldau", "Monaco", "Montenegro", "Niederlande", "Nordmazedonien", "Norwegen", "Österreich", "Polen", "Rumänien", "Russland", "San Marino", "Schweden", "Schweiz", "Serbien", "Slowakei", "Slowenien", "Spanien", "Tschechien", "Ukraine", "Ungarn", "Vatikanstadt", "Vereinigtes Königreich"};
        List<String> tmpList = Arrays.asList(land);
        Collections.shuffle(tmpList);
        System.out.println("Land: " + tmpList.get(0));
    }
}

image.png.bb6d35538d88f8a7b2630cc89cd8a6ee.png

Bearbeitet von XQBBN

  • XQBBN hat den Titel geändert in Ich möchte einen Land Generator erstellen, der mir ein Zufälliges Land rausspuckt. Das hab ich soweit geschafft. Problem ist, ich will, dass das Land nur einmal vorkommt. Manchmal kommt es vor, dass ein Land in der Liste doppelt vorkommt.
  • Autor
vor 2 Minuten schrieb be98:

Für mich sieht es so aus, dass du es hast mehrfach laufen lassen und Tschechien war zweimal an erster Position.

Genau. Ich drücke ein Knopf und ein zufälliges Land wird ausgegeben. Ich will jetzt die ganze Liste durchgehen ohne ein Land doppelt zu bekommen.

 

Geht so nicht. Wie soll das Programm wissen welche Länder bereits ausgegeben wurden? 

Pack das in einen Loop und lass darüber mehrere Ausgaben wiederholen. Dann kannst du bereits ausgegeben Länder in einer weiteren Liste zwischen speichern. Funktioniert aber nur so lange du dein Programm nicht neu startest.

 

Alternativ schreib bereits ausgegebene Länder in eine Datei/Datenbank.

  • Autor
vor 5 Minuten schrieb Soios:

Geht so nicht. Wie soll das Programm wissen welche Länder bereits ausgegeben wurden? 

Pack das in einen Loop und lass darüber mehrere Ausgaben wiederholen. Dann kannst du bereits ausgegeben Länder in einer weiteren Liste zwischen speichern. Funktioniert aber nur so lange du dein Programm nicht neu startest.

 

Alternativ schreib bereits ausgegebene Länder in eine Datei/Datenbank.

Danke für die Antwort, aber wie genau mache ich das? Ich bin ziemlich neu in Java und verstehe nicht viel. Wäre nett, wenn du mir einen Code schreiben könntest. 

Erstmal: Du muss nicht ein Array in eine Liste umwandeln, um diese dann zufällig zu sortieren. Du kannst auch einfach eine Nummer zwischen 0 und Anzahl der Elemente des Arrays generieren lassen und dann diese Zahl als Index für das Array verwenden.

Zweitens: Woher soll das Programm wissen, welches Land schon vorkam? Wenn du das Programm mehrfach aufrufen möchtest, muss ja irgendwo festgehalten werden, welches Land schon vorkam. z.B. in einer Textdatei, die dann gelesen wird. Dann braucht man eine Schleife, die so lange zufällig ein Land ermittelt, dass noch nicht ausgewiesen wurde und schreibt dann dieses Land in die Textdatei. Oder du machst es dir einfacher und gibst einfach die komplette Liste aus, die du schon zufällig sortiert hast.

Ich würde hier kein String Array nehmen. Selbst wenn es zum lernen ist. Diese Aufgabe ist eigentlich ganz nett um zu lernen, was HashMaps (bzw. Maps generell)/HashTables sind.

Auf diese Weise könntest du den Ländern jeweils einen eindeutigen Key geben, anstatt ständig Strings zu vergleichen.

Auch wie bereits hier geschrieben: Du kannst hier auch was über Streams lernen.

  • Autor

Ich habe es endlich geschafft. Jetzt habe ich ein weiteres Problem. Nachdem alle Länder ausgegeben werden, können sie nicht doppelt genutzt werden, weil die in einer Liste sind. Wenn es keine Länder mehr gibt, die ausgegeben werden sollen, dann soll der Inhalt der Liste gelöscht werden, um weiter zu spielen. Problem ist, beim löschen wird gleichzeitig ein Land ausgegeben. Also wird die Liste gelöscht und direkt kann ein neues Land ausgegeben und in die Liste gepackt werden.

 

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.Path;
import java.nio.charset.Charset;

public class Bundesländer {
    // Checked, ob BL schon gezeigt wurde
    public static Boolean wasCountryUsed(String country, List<String> usedCountries) {
        for (String item: usedCountries) {
            // Wenn es das BL schon gibt, dann wird re-shuffled
            if (item.equals(country)) {
                return true;
            }
        }
        return false;
    }
    
    public static void main() throws java.io.IOException {
        String[] BL = {"eins", "zwei", "drei", "vier", "fünf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zwölf", "dreizehn", "vierzehn", "fünfzehn", "sechzehn"};
        
        // Erstellt file, wenn es nicht existiert
        // Dieser file hat alle bereits gezeigten BL
        File countriesFile = new File("countries.txt");
        countriesFile.createNewFile();
        
        List<String> usedCountries = Files.readAllLines(countriesFile.toPath(), Charset.defaultCharset() );

        // Wenn alle BL gezeigt wurden, dann stopp
        if (usedCountries.size() == BL.length) {
            System.out.println("Es gibt keine Bundesländer mehr");
            
            // Reinigt die BL Liste, um neu anfangen zu können
            usedCountries.clear();
        }

        List<String> tmpList = new ArrayList<String>(Arrays.asList(BL));
        String country = "";

        // Re-shuffled in loop, bis ein neues BL vorkommt
        while (true) {
            Collections.shuffle(tmpList);
            country = tmpList.get(0);
            Boolean wasUsed = wasCountryUsed(country, usedCountries);
            if (wasUsed == false) {
                break;
            }
        }

        // Packt BL in benutzte BL Liste 
        usedCountries.add(country);
        Path out = Paths.get("countries.txt");
        Files.write(out, usedCountries, Charset.defaultCharset());

        BLQuiz.frage(country);
    }
}
 

 

Ps.: Hab ein bissle umgeändert wegen dem Projekt und aus zeitlichen Gründen.

Bearbeitet von XQBBN

Ja, gut dass es funktioniert. Ich würde  dir aber vorschlagen die Länder in einer Array von Objekten der Klasse Land zu speichern. Da kannst du auch einen boolean für bereits verwendet einbauen. Dann brauchst du nicht diese nervigen temp listen

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.