Auf einfache weise ints (die verändert werden) in Vector bekommen?


  • Mod

    zu 1. Wenn es nur ums schöne Aussehen geht, empfehle ich dir, die Java 1.5 Beta Version zu installieren und das ganze mit einer Collection vom Typ Integer zu machen. Da kannst du dann, wegen dem Autoboxing, so mit hantieren, als ob die Collection ints aufnehmen würde.

    zu 2. Das hört sich so an, als ob ein Vektor nicht die passende Collection ist. Entweder du solltest eine LinkedList oder eine Hashmap nehmen. Es ist aus deinem Text nicht ganz klar geworden, welches von beidem du brauchst. Es ist nur klar geworden, dass du keinen Vector brauchst.


  • Mod

    TGGC schrieb:

    Dann mach einfach eine Klasse, die nur einen int-Member hat.

    (Der Tipp war so genial, den musste ich jetzt unbedingt nochmal schreiben. 😉

    Bye, TGGC (Der Held ist zurück)

    Der Tipp war komplett überflüssig, weil es so eine Klasse schon gibt. Die Klasse Integer leistet genau das und sollte jedem bekannt sein, der mit Java programmiert.



  • Problem ist nur das das Programm für die Schule ist und wir da 1.5 nicht haben...

    -> Ich komm halt aus der C++ Branche und da sind Vectoren viel netter 🙂

    also mein Programm ist eigentlich recht Primitiv:

    man hat halt einen Wert 0 (int) und der wird um eins erhöht wenn man eine Checkbox (nen Radiobutton...) hinzufügt...
    und ich brauch halt die Anzahl der Checkboxen pro CheckboxGroup damit ich im Hauptprogramm (Applett) Helferlein benützen kann wie:
    Foo.HideAllBoxFrom(CheckboxGroup1) oder sowas halt..

    So ich hoffe nun ist's klar
    -> aber ich glaub ne LinkedList wäre besser weil mir HashMap unpassend klingt
    (ok ich hab von beiden keinen Schimmer was sie sind... 🙄 )



  • hab ich grad per google gefunden

    Du kannst keine elementaren Datentypen (byte, short, int , usw.) in eine LinkedList einfügen;

    super genau das kannen die Vector class auch nich also biringen mir Linkedlist's -> Nix..

    also ich seh ein ich muss so oder so meinen doofen int "Boxen" also behalte ich meinen Vector()...

    oder hat noch jemand ne geniale Idee?

    PS: hm.. seh ich richtgi das:
    in c++ -> Arrays sind böse -> use! vector
    in java -> Arrays sind auch böse aber nich soo.. -> vectoren sind! böse -> use! list / map / set

    🙂


  • Mod

    Du sagst ja, dass du die Anzahl der Elemente nicht vorher weißt.

    1. Wenn du die Anzahl direkt vor der Erstellung der Datenstruktur weißt, kannst du ganz normal ein Array nehmen.

    2. Wenn du nacheinander immer wieder weiter Elemente der Datenstruktur hinzufügen willst, aber keinen indizierten Zugriff auf die Elemente benötigst, dann nimmst du eine Liste, zum Beispiel ne LinkedList.

    3. Wenn du indizierten Zugriff auf die Elemente benötigst, du aber nicht andauernd weitere Elemente einfügen mußt, dann nimmst du eine ArrayList. Wenn dieser Fall zutrifft und du Multithreading nutzt, könnte möglicherweise ein Vector angebracht sein, weil bei diesem alles synchronisiert ist.

    4. Wenn du über ein anderes Objekt (als Schlüssel) auf die gespeicherten Elemente zugreifen möchtest, dann nimmst du eine HashMap. Im Multithreading-Fall könnte hier allerdings eine Hashtable angebracht sein (gleicher Grund wie bei 3).

    Es geht nicht darum, dass irgendetwas in Java gut oder schlecht ist. Alle Datenstrukturen haben ihr Einsatzgebiet. Vielleicht solltest du dir mal angucken, wie die entsprechenden Datenstrukturen aufgebaut sind. Damit du siehst, wo du was am Besten einsetzen solltest.


  • Mod

    Toblerone schrieb:

    PS: hm.. seh ich richtgi das:
    in c++ -> Arrays sind böse -> use! vector
    in java -> Arrays sind auch böse aber nich soo.. -> vectoren sind! böse -> use! list / map / set

    Nein, das siehst du falsch. Es gibt hier überhaupt kein böse/gut. Es gibt nur einen geeigneten Einsatz und einen ungeeigneten Einsatz. Arrays in Java und Arrays in C++ sind übrigens nicht gleich bzw. nicht äquivalent.



  • Gregor schrieb:

    Arrays in Java und Arrays in C++ sind übrigens nicht gleich bzw. nicht äquivalent.

    Desshalb hab ich ja c++ und java getrennt genannt *g*

    Es tut mir leid 🙂
    Ich hab bis jetzt noch nicht geschaft nen richtiges Tutorial zu lesen. *schäm*

    Ich denke ich benötige 3.)
    Denn ich brauche indizierten Zugriff und ich füge nur beim Initialisieren Elemente dazu, danach nichtmehr.

    Aber wann ist den dann ein Vector angebracht? (Ausser bei MultiThreading?)

    Hättest du denn Spontan einen Link zu den ArrayLists bzw. zum Aufbau der Datenstrukturen?
    -> Aber nur wenn du spontan was rumliegen hast ich such natürlich auch selbst 🙂



  • Gregor schrieb:

    TGGC schrieb:

    Dann mach einfach eine Klasse, die nur einen int-Member hat.

    (Der Tipp war so genial, den musste ich jetzt unbedingt nochmal schreiben. 😉

    Bye, TGGC (Der Held ist zurück)

    Der Tipp war komplett überflüssig, weil es so eine Klasse schon gibt. Die Klasse Integer leistet genau das und sollte jedem bekannt sein, der mit Java programmiert.

    In der Frage steht aber, er möchte Integer nicht nehmen.

    Bye, TGGC (Der Held ist zurück)



  • TGGC schrieb:

    In der Frage steht aber, er möchte Integer nicht nehmen.

    Die Frage war von meiner Seite schlecht gestellt..

    Ich meinte, dass wenn ich Vectoren nehme, dann muss ich aus meinen ints Integer machen. Wenn ich nun aber einen Integer (aus dem Vector) verändern möchte muss ich ihn erst in nen int umwandeln (bzw. den Wert aus dem Integer mit intValue() "herausholen"), nun den int verändern , danach wieder in einen Integer und zum Schluss jenen in den Vector "packen".

    Dies empfand ich als "unschön" dessshalb die Frage ob dies nicht einfacher ginge.

    _Toblerone_



  • Und daher meine Antwort, du machst eine klasse ala:

    class IntPackung
    {
    public int i
    }

    Und dann kannst du die Elemente im Vector auf "einfache weise" ändern:

    ((IntPackung)(vec.elementAt( 5 ) ) ).i+= 5

    Bye, TGGC (Der Held ist zurück)



  • Oh man 🙄
    Sorry, dass ich mal einen sehr alten Thread wieder hoch hole :p

    Wo ist das Problem?
    a) Array kann er nicht nehmen, weil die Größe sich ändert
    b) Es kommt nicht auf Performance an

    Also? Man nimmt doch ein Array, und ändert die Größe 🙄

    01 public int[][] changeSize(int[][] inArray, int inX, int inY, int outX, int outY)
    02 {		
    03   int[][] buf;
    04
    05   try
    06   {
    07     //Ein neues Array mit den gewünschten Maßen erzeugen.
    08     //Achtung: Hier kann es schnell zu einem OutOfMemory
    09     //kommen, daher die try-catch Schleife.
    10     buf = new int[outX][outY];
    11	
    12     for (int X = 0; X < inX; X++)
    13     {
    14       for (int Y = 0; Y < inY; Y++)
    15       {
    16         buf[X][Y] = inA[X][Y];
    17       }					
    18     }	
    19   }
    20   catch (Exception e)
    21   {
    22     return null;
    23   }
    24		
    25   return buf;
    26 }
    

    Man kann es auch ohne Rückgabe machen, indem man am Ende die alte
    Referenz mit dem buf überschreibt...

    Aber das ist ja wohl eine bessere Variante, als der ganze andere
    Kram 🙂



  • Schau dir mal System.Arraycopy an



  • Man kann es auch ohne Rückgabe machen, indem man am Ende die alte
    Referenz mit dem buf überschreibt...

    Nein, kann man nicht, weil die Referenz auf das Array per Value übergeben wird.



  • TGGC schrieb:

    Und daher meine Antwort, du machst eine klasse ala:

    class IntPackung
    {
    public int i
    }

    Und dann kannst du die Elemente im Vector auf "einfache weise" ändern:

    ((IntPackung)(vec.elementAt( 5 ) ) ).i+= 5

    Bye, TGGC (Der Held ist zurück)

    Wenn du dir schon einen eigenen Wrapper schreibst, dann kannst du ihm auch gleich eine Methode a la public void inc(); geben...



  • interpreter schrieb:

    Man kann es auch ohne Rückgabe machen, indem man am Ende die alte
    Referenz mit dem buf überschreibt...

    Nein, kann man nicht, weil die Referenz auf das Array per Value übergeben wird.

    Stimmt, habs gerade probiert 😉 Dachte es würde gehen, weil ein int Array
    auch als Object anerkannt wird, vom der API. Obwohl int kein Object ist!

    Um die Nachfrage gleich im Keim zu ersticken:
    Man kann mit der Methode writeObject() von ObjectOutputStream zum Beispiel
    auch ein int Array schreiben. Hab die Methode jetzt nicht nachgesehen, aber
    ich denke sie wurde so geschrieben 😉



  • interpreter schrieb:

    Schau dir mal System.Arraycopy an

    Ja, geht aber nur mit eindimensionalen Arrays 😉 Und so ist man
    auf der sicheren Seite (mit meinen Code). Wenn es halt nicht auf
    Speed ankommt. Mit einer zusätzlichen Abfrage könte man das
    verkleinern eines Arrays auch noch realisieren.


Anmelden zum Antworten