zufallszahl aus einem int-array ohne wiederholung

  • Ich kenn mich mit Java auch nicht so gut aus.


    Ich auch nicht. Eben deshalb treffe ich keinerlei Aussagen über die Funktionalität, wenn ich es nicht ganz genau weiß. ^^



    Aber ich würde behaupten wenn man ein new macht und eine Liste übergibt, dass es die Werte übernhemen soll,
    müssen die werte genauso kopiert werden wie mit einer Schleife und dabei muss auch die Größe bestimmt werden. Und dazu noch Speicher allokiert werden.


    Tja, fragen wir doch mal 'Das Internet™'.

    Code
    public ArrayList(Collection<? extends E> c) {
      elementData = c.toArray();
      size = elementData.length;
      // c.toArray might (incorrectly) not return Object[] (see 6260652)
      if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
    }


    Sie nutzen also Arrays.copyOf().

    Code
    public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
      T[] copy = ((Object)newType == (Object)Object[].class) ? (T[]) new Object[newLength] : (T[]) Array.newInstance(newType.getComponentType(), newLength);
      System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
      return copy;
    }


    Nicht, dass ich da jetzt durchsehen würde, doch es sieht mir nach was ganz Anderes aus als einer For-Schleife. ;)
    System.arrayCopy(...) sagt leider nix darüber aus, wie es weiter geht. Das wird daher vermutlich Sache der RunTimeEnvironment sein. Und die ist per Definition besser und performanter als eine For-Schleife. ;)


    Klar der Garbage kollektor macht viel, aber braucht auch seine rechenzeit dafür...


    Mir wäre eine manuelle Speicherverwaltung lieber. Gibt es unter Android nicht, also ist es auch egal.
    Der Garbage Collector ist die einzige Möglichkeit der Speicherverwaltung, also müssen wir uns darauf verlassen, dass sie ordentlich funktioniert.


    Ich kenn es auf jedenfall von c++, dass zuweisungen viel weniger Zeit brauchen als speicherallokation.


    Eierst du in C++ mit Nachrichten an die Objekte herum? Soweit ich weiß greifst du da direkt auf die Member zu, was natürlich eine Ressourcenersparnis darstellt.
    Da Java aber kein C++ ist, hilft dir das Wissen hier leider nicht weiter.


    Aber ich kenn mich auch nicht so gut aus. Das gleiche Ergebnis kommt auf jedenfall raus


    Natürlich. Du fingst mit Optimierungsvorschlägen an und ich meinte es gäbe nix zu optimieren.
    Funktional ist beides und die new-Variante ist sprechender.
    (Ja, ich weiß. Sprechender Code ist nicht ausschlaggebend für C++ Entwickler. +scnr+)

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Stimmt du hast recht. Wie ich im internet gefunden habe wäre die effizienteste Methode in unserem Fall mit


    Java
    System.arraycopy(array,1,copy,1,3);




    zu arbeiten.
    Dann würden wir die "perfekteste" kopiervariante der JRE nehmen und keinen Speicher neu allokieren.

  • Hallo CdWechsler,


    zu deiner ursprünglichen Frage

    Zitat

    eine Zufällige Zahl aus einem int[5] array ohne wiederholung

    würde ich einfach nur mit

    Code
    Collections.shuffle(arrayList);


    den Zufall walten lassen und dann einfach nacheinander abspielen

    Code
    for (int i=0; i < arrayList.size()-1;i++)
    {
    	// Hier abspielen
    }


    Wenn dann weiter gespielt werden sol, einfach nur mit Collections.shuffle neu würfeln lassen.


    Funktioniert bei meiner App MusikZeit sehr gut........


    Schöne Grüße, schymura ^^

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!