Zum Inhalt springen

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 Beiträge

Geschrieben (bearbeitet)

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 änderte den Titel 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.
Geschrieben
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.

 

Geschrieben

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.

Geschrieben
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. 

Geschrieben

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.

Geschrieben

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.

Geschrieben (bearbeitet)

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
Geschrieben

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

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...