Zufälliges Objekt aus der ArraylList ohne java.util.Random

LucaToni

Aktives Mitglied
Hallo,

gibt es eine Möglichkeit ein zufälliges Objekt aus einer ArrayList zurückzugeben ohne die Klasse java.util.Random zu benutzen?
 
Nachtrag:
Code:
public class LinearCongruentialGenerator {

    private int max;
    private int last;

    public static void main(String[] args) {
        SimpleRandom rand = new SimpleRandom(10);

        for (int i = 0; i < 100; i++) {
            System.out.println(rand.nextInteger());
        }

    }

    public LCG(int max){
        this.max = max;
        
        last = (int) (System.currentTimeMillis() % max);
    }
    
    public int nextInteger(){
        last = (last * 32719 + 3) % 32749;
        return last % max;
    }
}
Wie aber schon im Wikipedia geschrieben ist dieses keine echte Zufallszahl, sondern es sieht nur so aus als sei es ein.
 
Er hat nur geschrieben


Also bitte erst lesen, dann schreiben.
Keine Sorge, wie du der ersten Antwort in diesem Thread entnehmen kannst, hab ich seine Frage gelesen.

Das sollte nur ein weiterer Hinweis sein, das es ziemlicher Unsinn ist, auf java.util.Random zu verzichten, wenn es nicht sehr gute Gründe dagegen gibt - und wenn es Gründe gibt, sprechen die meist auch gegen ein (schlechtes) Nachimplementieren von Random.

Es gibt durchaus genügend Dinge an Random, die schlecht gelöst sind, aber die sind in nahezu jeder eigenen Implementierung noch schlechter gelöst, zusätzlich zu anderen Problemen.
 
Keine Sorge, wie du der ersten Antwort in diesem Thread entnehmen kannst, hab ich seine Frage gelesen.

Das sollte nur ein weiterer Hinweis sein, das es ziemlicher Unsinn ist, auf java.util.Random zu verzichten, wenn es nicht sehr gute Gründe dagegen gibt - und wenn es Gründe gibt, sprechen die meist auch gegen ein (schlechtes) Nachimplementieren von Random.

Es gibt durchaus genügend Dinge an Random, die schlecht gelöst sind, aber die sind in nahezu jeder eigenen Implementierung noch schlechter gelöst, zusätzlich zu anderen Problemen.
Da stimme ich dir zu. Aber woher weist du, dass es nicht aus einer Aufgabe stammt und der Dozent bewusst reingeschrieben hat: "Es soll nicht die Klasse java.util.Random benutzt werden"?
 
Aber woher weist du, dass es nicht aus einer Aufgabe stammt und der Dozent bewusst reingeschrieben hat: "Es soll nicht die Klasse java.util.Random benutzt werden"?
Ich weiß es nicht, aber die meisten Dozenten sind zu besseren Aufgaben in der Lage 🙂

So eine Aufgabe wäre für Anfänger auf keiner Ebene interessant. Interessant wäre es vielleicht im Sinne von „was kann man besser machen als Random“, aber das würde dann nicht hier im Anfänger-Forum landen, und vor allem nicht im Kontext der Verwendung mit ArrayList 🙂
 
Ich weiß es nicht, aber die meisten Dozenten sind zu besseren Aufgaben in der Lage 🙂

So eine Aufgabe wäre für Anfänger auf keiner Ebene interessant. Interessant wäre es vielleicht im Sinne von „was kann man besser machen als Random“, aber das würde dann nicht hier im Anfänger-Forum landen, und vor allem nicht im Kontext der Verwendung mit ArrayList 🙂
Woher willst du

1. Wissen das er ein Anfänger ist?
2. Er z.B. nicht Informatik studiert?

Ich wiederhole mich. Er hat lediglich geschrieben:
gibt es eine Möglichkeit ein zufälliges Objekt aus einer ArrayList zurückzugeben ohne die Klasse java.util.Random zu benutzen?
und evtl. ist es eine Aufgabe des Dozenten. Ich selber habe als Dozent (im Auftrag meines Profs) an der FH so eine ähnliche Aufgabe damals meinen Studenten gegeben. Allerdings in C++.
 
Also der TE hat es als Anfänger Thema einsortiert. Daher ist die Annahme, dass ein Anfänger die Frage aufgeworfen hat doch durchaus gerechtfertigt...

Und wann ist man kein Anfänger mehr? Wenn man in einem Informatik LK 15 Punkte hat? Oder wenn man sich eingeschrieben hat?

In meinen Augen gehört da etwas mehr dazu. Das haben hier genug Leute gut demonstriert.

Und auch bei manchen Aufgabenblättern unterstelle ich dem Ersteller, dass er in Sache Softwareentwicklung ein Anfänger ist.... nicht hier - da kenne ich zu wenig ... der Kontext kann das ja rechtfertigen ... und soqas wirst du bestimmt auch schon gesehen haben ....
 
Schon mal Entschuldigung für das OT, ich hoffe mal der TO hat bereits eine Antwort zu seiner Frage bekommen 🙂


Woher willst du

1. Wissen das er ein Anfänger ist?
2. Er z.B. nicht Informatik studiert?
Beides weiß ich nicht, ich kann nur aus dem hier bekannten Kontext etwas schlussfolgern 🙂

Das er Anfänger ist, schließe ich einfach mal aus dem Bereich - "Anfänger-Themen" - in dem wie uns hier befinden und aus der Fragestellung. Jemand mit viel Erfahrung in Java würde sie vermutlich anders stellen (zb den Kontext der ArrayList weglassen; Gründe aufführen, warum Random nicht geeignet ist, ...).

Das er Informatik studiert bzw Java lernt, würde ich einfach mal daraus schließen, dass er im Anfängerforum eine Frage zu Java stellt.

Also Ja, ich gehe davon aus, dass @LucaToni grad im Begriff ist, Java zu lernen, vermutlich im Rahmen eines Studiums 🙂 Falls ich damit falsch liege möge er mich gerne korrigieren 🙂


und evtl. ist es eine Aufgabe des Dozenten. Ich selber habe als Dozent (im Auftrag meines Profs) an der FH so eine ähnliche Aufgabe meinen Studenten gegeben. Allerdings damals auf C++.
Natürlich kann es eine Aufgabe eines Dozenten sein, nur ist es dann eine sehr schlechte.

Einmal aufgrund des Kontextes mit der ArrayList: Ginge es hauptsächlich um die Implementierung des Zufallszahlen-Generators, wäre das ziemlich sinnlos, stattdessen gäbe es deutlich sinnvollere Möglichkeiten für die Anwendung drum herum. Außerdem kann man durch den Kontext durchaus annehmen, dass die Zufallszahlen-Generierung Teil einer größeren Aufgabe ist. In einer größeren Aufgabe, die offensichtlich die Benutzung von JDK-Klassen erlaubt, einzelne JDK-Klassen, vor allem aus solchen Randgebieten, zu verbieten, ist auch wenig sinnvoll. Sinnvoller wäre in einem solchen Kontext das explizite Fordern der Nutzung vorhandener Klassen - ein typisches Problem ist eben "ich mache alles selber" anstatt eines "Nutz das Vorhandene", mit so einer Aufgabe verstärkt man das dann noch.

Und dazu kommt: die Implementierung eines Zufallszahlen-Generators bringt für sich genommen keinen interessanten Lerneffekt.
  • Es ist kein Modellierungsproblem, auf der Ebene hat man also schon mal keinen Lerneffekt - anders als das typische "Telefonbuch erstellen", "Bank und Konto programmieren", Aufgaben die man hier öfters sieht.
  • Es ist kein interessanter "Algorithmus", der nötig ist. Die ganze Code dahinter ist effektiv ein trivialer Einzeiler, den man von Wikipedia kopieren kann. Man muss uU ein paar Randfälle berücksichtigen, die sind aber eben auf Java-Ebene und grad für Anfänger völlig uninteressant. Eine schönere Aufgabe auf dieser Ebene wäre zB die typische LinkedList, sieht man hier auch oft.
  • Es ist nichts, wo man "schönen Code" lernen könnte, da es eben kaum Code gibt.
  • Das ganze führt nicht zu irgendwelchen Sinnvollen Unit-Tests, da eben kaum Code und man für Zufallszahlen Tests auf ganz andere Ebene braucht.
Im Gesamten sehe ich einfach nicht, wie diese Frage irgendwie für Anfänger interessant sein könnte.


Die Aufgabe kann für Fortgeschrittene durchaus Sinn machen, im Sinne von "wie könnte man die gesamte Random-API anders, besser, modellieren", quasi analog zu "von Date zu java.time" - wenn zB @JustNobody diese Frage gestellt hätte, würde ich so einen Hintergrund erwarten (allerdings würde die Fragestellung dann vermutlich schon eine fertige Lösung beinhalten) - eine Frage auf der Ebene sehe ich hier aber nicht.
 
Also der TE hat es als Anfänger Thema einsortiert. Daher ist die Annahme, dass ein Anfänger die Frage aufgeworfen hat doch durchaus gerechtfertigt...

Und wann ist man kein Anfänger mehr? Wenn man in einem Informatik LK 15 Punkte hat? Oder wenn man sich eingeschrieben hat?

In meinen Augen gehört da etwas mehr dazu. Das haben hier genug Leute gut demonstriert.

Und auch bei manchen Aufgabenblättern unterstelle ich dem Ersteller, dass er in Sache Softwareentwicklung ein Anfänger ist.... nicht hier - da kenne ich zu wenig ... der Kontext kann das ja rechtfertigen ... und soqas wirst du bestimmt auch schon gesehen haben ....
Ein Anfänger ist man immer, wenn man sich weiterbildet / etwas neues lernt. Also insofern gebe ich dir vollkommen Recht @JustNobody
 
Schon mal Entschuldigung für das OT, ich hoffe mal der TO hat bereits eine Antwort zu seiner Frage bekommen 🙂



Beides weiß ich nicht, ich kann nur aus dem hier bekannten Kontext etwas schlussfolgern 🙂

Das er Anfänger ist, schließe ich einfach mal aus dem Bereich - "Anfänger-Themen" - in dem wie uns hier befinden und aus der Fragestellung. Jemand mit viel Erfahrung in Java würde sie vermutlich anders stellen (zb den Kontext der ArrayList weglassen; Gründe aufführen, warum Random nicht geeignet ist, ...).

Das er Informatik studiert bzw Java lernt, würde ich einfach mal daraus schließen, dass er im Anfängerforum eine Frage zu Java stellt.

Also Ja, ich gehe davon aus, dass @LucaToni grad im Begriff ist, Java zu lernen, vermutlich im Rahmen eines Studiums 🙂 Falls ich damit falsch liege möge er mich gerne korrigieren 🙂



Natürlich kann es eine Aufgabe eines Dozenten sein, nur ist es dann eine sehr schlechte.

Einmal aufgrund des Kontextes mit der ArrayList: Ginge es hauptsächlich um die Implementierung des Zufallszahlen-Generators, wäre das ziemlich sinnlos, stattdessen gäbe es deutlich sinnvollere Möglichkeiten für die Anwendung drum herum. Außerdem kann man durch den Kontext durchaus annehmen, dass die Zufallszahlen-Generierung Teil einer größeren Aufgabe ist. In einer größeren Aufgabe, die offensichtlich die Benutzung von JDK-Klassen erlaubt, einzelne JDK-Klassen, vor allem aus solchen Randgebieten, zu verbieten, ist auch wenig sinnvoll. Sinnvoller wäre in einem solchen Kontext das explizite Fordern der Nutzung vorhandener Klassen - ein typisches Problem ist eben "ich mache alles selber" anstatt eines "Nutz das Vorhandene", mit so einer Aufgabe verstärkt man das dann noch.

Und dazu kommt: die Implementierung eines Zufallszahlen-Generators bringt für sich genommen keinen interessanten Lerneffekt.
  • Es ist kein Modellierungsproblem, auf der Ebene hat man also schon mal keinen Lerneffekt - anders als das typische "Telefonbuch erstellen", "Bank und Konto programmieren", Aufgaben die man hier öfters sieht.
  • Es ist kein interessanter "Algorithmus", der nötig ist. Die ganze Code dahinter ist effektiv ein trivialer Einzeiler, den man von Wikipedia kopieren kann. Man muss uU ein paar Randfälle berücksichtigen, die sind aber eben auf Java-Ebene und grad für Anfänger völlig uninteressant. Eine schönere Aufgabe auf dieser Ebene wäre zB die typische LinkedList, sieht man hier auch oft.
  • Es ist nichts, wo man "schönen Code" lernen könnte, da es eben kaum Code gibt.
  • Das ganze führt nicht zu irgendwelchen Sinnvollen Unit-Tests, da eben kaum Code und man für Zufallszahlen Tests auf ganz andere Ebene braucht.
Im Gesamten sehe ich einfach nicht, wie diese Frage irgendwie für Anfänger interessant sein könnte.


Die Aufgabe kann für Fortgeschrittene durchaus Sinn machen, im Sinne von "wie könnte man die gesamte Random-API anders, besser, modellieren", quasi analog zu "von Date zu java.time" - wenn zB @JustNobody diese Frage gestellt hätte, würde ich so einen Hintergrund erwarten (allerdings würde die Fragestellung dann vermutlich schon eine fertige Lösung beinhalten) - eine Frage auf der Ebene sehe ich hier aber nicht.
Da gebe ich dir natürlich Recht, dass so eine Aufgabe eigentlich schlecht ist, allerdings, so war es bei mir damals, als Nicht-Prof (war nur ein einfacher Dozent), die Aufgaben so durchzuführen, wie der Prof es haben will.
 
Hallo alle zusammen,

vielen Dank für die Tipps.
ich Klär mal auf bevor ihr euch noch mehr in die Haare kriegt.

1.) Ich bin Anfänger
2.) es ist ein Teil einer Aufgabe, in der man die Lieder einer Playlist zufällig zurückgeben muss und die bereits gespielten Lieder in einer hashset speichern muss.
3.) meine Uni spinnt etwas rum mit den Aufgaben und erwartet echt viel von Informatik für NICHT-INFORMATIKER und es gibt auch Aufgaben in der man Statt fertige Bibliotheken zu nutzen, Code schreiben soll, der die gleiche Funktion erfüllt wie fertige Klassen aus der Java-API... deshalb kam die Frage hier ob es eine Alternative gibt.
4.) Danke allen die mit einem guten Willen an meine Frage ran sind.
 
Nachtrag:
Code:
public class LinearCongruentialGenerator {

    private int max;
    private int last;

    public static void main(String[] args) {
        SimpleRandom rand = new SimpleRandom(10);

        for (int i = 0; i < 100; i++) {
            System.out.println(rand.nextInteger());
        }

    }

    public LCG(int max){
        this.max = max;
       
        last = (int) (System.currentTimeMillis() % max);
    }
   
    public int nextInteger(){
        last = (last * 32719 + 3) % 32749;
        return last % max;
    }
}
Wie aber schon im Wikipedia geschrieben ist dieses keine echte Zufallszahl, sondern es sieht nur so aus als sei es ein.
Da hast du aber noch ein paar Hürden eingebaut, oder? Die Klasse heißt anders als ihr Konstruktor und in der main() wird noch eine andere Klasse instantiiert. 😉
 
Statt fertige Bibliotheken zu nutzen, Code schreiben soll, der die gleiche Funktion erfüllt wie fertige Klassen
Mit so etwas hätten aber auch Informatik-Studierende oder Absolventen ein Problem.... Auf der anderen Seite kann es von Nutzen sein, die Hintergründe dieser oder jener Bibliotheksfunktion/API/... oder das Verhalten der JVM auf der elementaren Ebene zu kennen. Bzgl. Zufall kann radioaktiver Zerfall -neben der Systemzeit- einer näheren Recherche wert sein.
 
Wenn ich zur Implementierung etwas nicht verwenden soll, suche ich dazu die bestmögliche oder einfachst mögliche Alternative. Insofern hat @TM69 vollkommen recht. Ich suche nicht nach der abwegigsten Möglichkeit (wie sie mrBrow vorschlägt). Der Prof kann damit überprüfen, wie gut der/die Studierende ihr Wissen bei geänderten Anforderungen übertragen kann. Wenn die Aufgabe lautet, baue ein Auto mit drei Rädern anstatt vier, wird garantiert kein Flugzeug das fährt mit drei Rädern erwartet, obwohl es formal so definiert sein könnte.
 
Da hast du aber noch ein paar Hürden eingebaut, oder? Die Klasse heißt anders als ihr Konstruktor und in der main() wird noch eine andere Klasse instantiiert. 😉
Wenn du kein Prof, so wie ich war, sondern nur vom Dekan (seines Zeichens Prof. Dr. Dr.) beauftragt, hat man das Manuskript / Aufgaben des Profs. einzuhalten. So war es zumindest damals bei mir. Dieses soll allerdings absolut nicht heißen, dass es evtl. an anderen Unis anders ist. Ergänzend dazu sollte ich evtl. erwähnen es waren Studierende des 3. Semesters - sprich noch Anfänger. Natürlich hast du in solchen Kursen immer Leute, die bereits tiefgreifende Erfahrungen hat. Allerdings gebe ich dir zu bedenken, eine Kette ist nur so stark, wie das schwächste Glied.
 
Zuletzt bearbeitet:
Wenn du kein Prof, so wie ich war, sondern nur vom Dekan (seines Zeichens Prof. Dr. Dr.) beauftragt war, hat man das Manuskript / Aufgaben des Profs. einzuhalten. So war es zumindest damals bei mir. Dieses soll allerdings absolut nicht heißen, dass es evtl. an anderen Unis anders ist.
Er meinte deinen Beispielcode hier im Thread, nicht irgendeine Aufgabe die du vielleicht irgendwannmal gestellt hast.
 
Dann verstehe ich gerad nicht was du von mir willst

Java:
public class LinearCongruentialGenerator { // "LinearCongruentialGenerator"

    public static void main(String[] args) {
        SimpleRandom rand = new SimpleRandom(10); // "SimpleRandom"

    }

    public LCG(int max){ // "LCG"

    }

}
 
Java:
//Habe eine HashSet mit den bereits gespielten Liedern. Die ist leer am Anfang
//Hashset name ist absgepsielt
//ich möchte ein Lied zufällig wiedergeben, dafür erstelle ich mit Random eine ganzzahl
//die zufällige ganzzahl ist abspieleNr.
//Ich möchte das abgepsielte Lied in meine Hashset hinzufügen und dann das zufällige
//lied zurückgeben.


public Musikliste shuffle()
    {
        Random titelNr=new Random();
        int abspieleNr=titelNr.nextInt(lieder.size());
        if(abgespielt.containsAll(lieder))
        {abgespielt.clear();}
        abgespielt.add(lieder.get(abspieleNr));
        
        return lieder.get(abspieleNr);
        
    }

Warum funktioniert das nicht. -.-
 
Also du solltest etwas besser beschreiben, was nicht funktioniert.

Was ich jetzt vermute: Du willst nur Lieder spielen, die noch nicht abgespielt sind. Aber das macht Dein Code nicht:
Dein Code wählt ein beliebiges Lied aus lieder aus.
Desweiteren prüfst Du, ob alle Lieder aus lieder auch in abgespielt sind, dann würde abgespielt geleert.
Du fügst das gewählte lied zu abgespielt hinzu (könnte aber auch schon drin sein!)
Und du gibst das gewählte Lied zurück.

Aber die Logik wäre doch eher (mit Deinen Variablen):
- Du wählst so lange ein neues Lied aus, bis das gewählte Lied nicht in abgespielt ist. Hier würde sich eine do/while Schleife anbieten.
- Die Kontrolle, ob alle Lieder gespielt wurden, ist aber falsch. Das muss entweder am Anfang oder am Ende erfolgen.

==> Problem mit dem falschen Ort: Du hast nur noch ein Lied, dieses wird ausgewählt. Alle Lieder sind noch nicht gespielt. Nun fügst Du das Lied ein und beim nächsten Mal gibt es dann keine ungespielten Lieder mehr und Du hast eine Endlosschleife.

Der Algorithmus ist aber auch nicht gut. Stell Dir vor, du hast 10.000 Lieder und nur ein Lied ist noch nicht gespielt worden ... da kann die Schleife schon etwas laufen 🙂

Warum merkst Du Dir keine Playlist. Dann ist das abgespielt egal. Du hast also eine Playlist und wenn die leer ist, dann fügst Du alle Lieder ein. Ggf. mit einem shuffle Aufruf, damit du eine zufällig Reihenfolge hast. Gespielte Lieder entfernst Du und somit hast du nur noch eine Zufallszahl zu ermitteln.
 
Du hast es schon recht gut erfasst.
wie bekomme ich ein return aus der HashSet?

Das Problem ist ich bekomme momentan mit lieder.get() ein Lied aus der lieder ArrayList zurück. eigentlich will ich ja das Lied was gerade in die Hashset eigefügt wurde zurückbekommen. Habe jetzt auf die schnelle keine Methode gefunden, die mir elemente aus meiner Hashset zurückgibt....
 
Warum willst du ein Lied aus dem HashSet bekommen - deinem Code und deiner Erklärung nach willst du etwas in das Set legen?

//ich möchte ein Lied zufällig wiedergeben, dafür erstelle ich mit Random eine ganzzahl
//die zufällige ganzzahl ist abspieleNr.
//Ich möchte das abgepsielte Lied in meine Hashset hinzufügen und dann das zufällige
//lied zurückgeben.

Das kann man doch einfach der Reihe nach abarbeiten:
* zufällige Nummer generieren
* Lied zu der Nummer raussuchen
* Lied in das Set legen
* Lied zurückgeben
 
Warum willst du ein Lied aus dem HashSet bekommen - deinem Code und deiner Erklärung nach willst du etwas in das Set legen?



Das kann man doch einfach der Reihe nach abarbeiten:
* zufällige Nummer generieren
* Lied zu der Nummer raussuchen
* Lied in das Set legen
* Lied zurückgeben

Das gelegte wieder zurückbekommen, da ja in einem Set keine Duplikate vorhanden sein können dachte ich wäre es die beste Lösung, damit ich kein Lied doppelt abspiele.
 
Das gelegte wieder zurückbekommen, da ja in einem Set keine Duplikate vorhanden sein können dachte ich wäre es die beste Lösung, damit ich kein Lied doppelt abspiele.
Prüf doch einfach ob es schon im Set liegt, wenn du das vermeiden willst?

Oder entfern jedes schon gespielte aus der Liste der noch zu spielenden Lieder.
 
Prüf doch einfach ob es schon im Set liegt, wenn du das vermeiden willst?

Oder entfern jedes schon gespielte aus der Liste der noch zu spielenden Lieder.
verstehe ich nicht.
ich habe doch die ArrayList mit den Liedern.
dann habe ich noch die HashSet mit den abgepspielten Liedern.

mit abgepsielt.add().... füge ich doch der HashSet bereits die Lieder hinzu die abgespielt wurden.
Jetzt will ich einfach nur noch die Lieder der Hashset mit return zurückgeben.
 
Trenn dich von der Idee, irgendwas aus dem HashSet zu holen.
Du brauchst das Set nur, um Dinge reinzulegen und um zu prüfen, ob etwas drin ist.
Das Konzept ist blöd - Warum nicht auch gleich zurückgeben, wenn ich sowieso abfragen kann was drin ist, ist definitv nicht effizient?????!!!!!!!
einfach hashset.get<key> wäre doch viel besser, wie bei Listen. Jetzt muss ich mir überlegen wie ich das lösen kann.

Mit do....while geht es nicht so wie ich es will.... oder ich bekomme das nicht so hin.

Was ist mit einem Iterator? Kann man damit die Elemente rausholen?
 
Das Konzept ist blöd - Warum nicht auch gleich zurückgeben, wenn ich sowieso abfragen kann was drin ist, ist definitv nicht effizient?????!!!!!!!
einfach hashset.get<key> wäre doch viel besser, wie bei Listen. Jetzt muss ich mir überlegen wie ich das lösen kann.

Mit do....while geht es nicht so wie ich es will.... oder ich bekomme das nicht so hin.

Was ist mit einem Iterator? Kann man damit die Elemente rausholen?

Die Frage ergibt keinen Sinn. Du kannst nur Abfragen ob ein Objekt im Set vorhanden ist. Ein get(Object) würde dir das selbe Objekt zurückliefern.
 
Das Konzept ist blöd - Warum nicht auch gleich zurückgeben, wenn ich sowieso abfragen kann was drin ist, ist definitv nicht effizient?????!!!!!!!
einfach hashset.get<key> wäre doch viel besser, wie bei Listen. Jetzt muss ich mir überlegen wie ich das lösen kann.
Erstmal: ein HashSet kennt keine Keys, es kennt nur die Elemente, die dann auch enthalten sind.
Genau deshalb macht ein get auch wenig Sinn: ein hashSet.get(xy) würde genau das Element zurück geben, welches du übergeben hast. Statt einem return hashSet.get(xy); kannst du also genauso einfach return xy; nutzen - die beiden sind gleichwertig.

Selbst wenn es ein get gäbe, wie sollte das in deinem Anwendungsfall helfen?
Wenn du vorher add aufrufst, gibt das get genau das Element zurück, welches du hinzugefügt hast - das get ist also überflüssig, das Element, welches du zurück bekommen würdest, hast du ja schon.
Wenn du vorher kein add aufrufst (und damit nicht weißt, ob das Element enthalten ist), kannst du einfach contains nutzen. Mehr Informationen würde dir ein get auch nicht liefern (das würde nämlich entweder null oder das Objekt, welches du ja bereits hast, zurückgeben - wäre dann sogar mehr Aufwand).

Also Ja: das Konzept ist blöd, in diesem Fall allerdings nicht das des HashSets.

Mit do....while geht es nicht so wie ich es will.... oder ich bekomme das nicht so hin.
Vermutlich letzteres, zeig doch mal deinen Code.

Was ist mit einem Iterator? Kann man damit die Elemente rausholen?
Ja, kann man. Und Nein, das ist in diesem Fall nicht sinnvoll. Das Element, welches du rausholen willst, hast du schon.
 
Mein Code war vollkommen richtig. Da hat nur was kleines gefehlt. Jetzt funktioniert es.

Ihr hättet mir ruhig sagen können dass alles an meinem Code RICHTIG ist, und mir eigentlich nur eine while-Schleife fehlt...

NAJAAAAA DANKE TROTZDEM ALLEN die mir versucht haben zu helfen.


Man sucht nach einer Lösung bei anderen, obwohl die eigene Lösung am nächsten zur eigentlichen Lösung ist....
 
Also schön, dass du eine funktionierende Lösung gefunden hast. Deine übrige Aussage würde ich etwas anzweifeln, aber vielleicht willst du uns Deine Lösung ja einmal zeigen ....
 
Mein Code war vollkommen richtig.
Welcher? Die shuffle-Methode aus #27? Nicht wirklich, zumal Du in #1 geschrieben hast, dass Du ohne Random auskommen musst. Die Methode gibt einfach ein x-beliebiges, zufällig gewähltes Lied zurück, mit einem Mischen (shuffle) hat das allerdings nichts zu tun. Natürlich kannst Du dafür so lange ein beliebiges Element suchen, bis Du eines findest, das bislang nicht gespielt wurde, das ist aber äußerst ineffizient.
 
Also schön, dass du eine funktionierende Lösung gefunden hast. Deine übrige Aussage würde ich etwas anzweifeln, aber vielleicht willst du uns Deine Lösung ja einmal zeigen ....

Code:
public Lied shuffle()
    {
        Random titelNr=new Random();
        
        
        int abspieleNr=titelNr.nextInt(lieder.size());
        
        
        if(abgespielt.containsAll(lieder))
        {
        abgespielt.clear();
        }
        
        while(abgespielt.contains(lieder.get(abspieleNr))) //Diese Schleife hat in meinem Code gefehlt.
        {
        abspieleNr=titelNr.nextInt(lieder.size());}
        abgespielt.add(lieder.get(abspieleNr));
        
        
       return lieder.get(abspieleNr);
        
        
}

Hab die Schleife kommentiert die gefehlt hat... alles andere hatte ich in #27 schon drin meine ich. Aber ich glaube jemand hatte mir einen ähnlichen Tipp gegeben..nur war der Tipp so verdeckt, dass ich vom Hinweis nicht direkt auf die while-Schleife gekommen bin...
 
Ja, darauf trifft alles zu, was ich in #44 geschrieben habe 🙂

Abgesehen davon wäre das mit einer do-while-Schleife schöner.
 
Der Thread heisst ja auch "ohne java.util.random"... Ich bin ein bisschen überrascht ab Zeile 3

Das war wohl in der Aufgabenstellung falsch. Da stand zunächst.. Benutzen Sie bei Ihrer Lösung kein Random-Object. Später wurde es korrigiert und die haben Benutzen Sie bei Ihrer Lösung ein Random-Object reingeschrieben. Wurde als Tippfehler in der Aufgabenstellung angegeben. Aber hab ja dann eine Lösung mit Random-Object gepostet. Sollte dann klar sein, dass ich es doch mit Random lösen. Shuffle-Methode von collections wollte ich implementieren bis der Hinweis kam, dass wir doch ein Random Object benutzen sollen. Dann bin ich wieder umgeschweift auf den random zufallszahlengenerierer.
 

Zurück
Oben