Arraylist läßt sich nicht vergleichen ...



  • Hi,

    ich brauchte einen dynamischen Array und hab deshalb mal die Arraylist gewählt. Leider funktioniert das nicht so wie gedacht.

    ich fülle den array mit Integerwerten und möchte später eionen vergleich mit der arrayliste anstellen:

    ArrayList myArrayList = new ArrayList();
    int j = 0, index = 0;
    
    ...
    
    while ( j < myArrayList.get(index) )
    {
      //Anweisung
    }
    

    Der compiler meint jetzt ich könnte die beiden Typen nicht vergleichen. aber es sind doch beides Integer typen also müßte das doch klappen? also auch der inhalt der ArrayList sind integer.



  • Hi,

    ich vermute mal du füllst dein Array so?:

    myArrayList.add(5); // usw.
    

    Dann wirst du wohl Java 5 (oder besser) verwenden. Dann solltest du deine Liste so erstellen:

    ArrayList<Integer> myArrayList = new ArrayList<Integer>();
    

    Dann sollte es auch mit dem vergleichen klappen.

    Wieso? Eigentlich passen in eine Liste nur Objekte. Und Objekte lassen sich nicht einfach mit < oder > oder == vergleichen. Allerdings gibt es seit Java 5 Generics und das Auto(un)boxing. er verwandelt sozusagen die 5 dann in ein

    new Integer(5)
    

    und beim get(index), was eigentlich eine Referenz auf ein Integerobjekt zurückgibt, in ein

    myArrayList.get(index).intValue()
    

    (sollte intValue() sein, falls nicht, hats aber den gleichen Effekt).

    Normalerweise gibt so eine Liste auch nur eine referenz auf ein Object zurück, dass du eigentlich erst in ein Integer casten müsstest. Aber mit <Integer> bei der Listenerstellung sagst du, dass nur Integers (und deren Tochterklassen) in dieser Liste vorhanden sind, weshalb du dann nicht mehr explizit kasten musst (dies wird dir abgenommen).



  • Wenn man nun einen Vector mit primitiven Datentypen wie int, short, byte usw. haben möchte (zwecks Performance u.a.), müsste man die dann selber schreiben oder gibts dafür auch schon was in Java (ausser halt ein normales Array)?

    Was ist der Unterschied zwischen ArrayList und Vector? Beide basieren ja intern auf einem Array, oder?



  • Wenn man nun einen Vector mit primitiven Datentypen wie int, short, byte usw. haben möchte (zwecks Performance u.a.), müsste man die dann selber schreiben oder gibts dafür auch schon was in Java (ausser halt ein normales Array)?

    Soweit ich die Standardbibliotek von Java kenne, können alle Listen usw. nur Objekte aufnehmen. Entweder du nutzt die Wrapperklasse für int usw., oder du musst wohl selber solch eine Klasse schreiben (oder du verwendest eben ein Array).



  • hm, dann muß ich das mal probieren ...

    der unterschied zw. ArrayList und Vector ist nur, das der Vector syncronisiert wird was wiederum interessant ist wenn man mehrere threads hat. ansonsten ist die funktionalität ähnlich.



  • ich nochmal es hat funktioniert 🙂 das <Integer> setzt also alle elemente der ArrayList auf einen integer wert oder?

    Wie wäre es denn, wenn man unterschiedliche datentypen in der Liste hat? Da belibt einemd ann doch nur das Element mittels "get" herauszuholen und dann in einer extra variable abzulegen um diese dann in den gewünschten Datentyp zu casten oder?



  • Man braucht schon etwas in der Liste was Compareable implementeirt zum Vergleich.
    Das mit den unterschiedlichen Datentypen in einer Datenstruktur geht nicht. Woher willst du wissen, in was du casten musst?



  • das <Integer> setzt also alle elemente der ArrayList auf einen integer wert oder?

    Nein, nicht ganz. In der Liste werden die Elemente trotzdem noch als Object-Referenz gehandhabt. Nur der Compiler weiß so, dass nur z.B. Integer (also Integer-Object, kein primitiver Datentyp) in der Liste vorkommt, und er somit genau weiß, dass aus der Liste auch nur ein Integer raus kommen kann (oder eben deren Tochterklassen). Aber dazu solltest du dir vlt. mal was über die Generics bei Java anlesen.

    Das mit den unterschiedlichen Datentypen in einer Datenstruktur geht nicht. Woher willst du wissen, in was du casten musst?

    Naja, gehen tuts schon.
    Bsp.:

    ArrayList<Number> list=new ArrayList<Number>();
    
    // füllen...
    list.add(5);
    list.add(4.8);
    list.add(new Short((short)9));
    // usw.
    
    for(Number n: list)
    {
      if(n instanceof Integer)
        System.out.println(n.intValue());
      else if(n instnaceof Double)
        System.out.println(n.doubleValue());
      else if(n instanceof Short)
        System.out.println(n.shortValue());
      else
        ; // Sonst was machen...
    }
    

    Aber eigentlich nicht grad schön, finde ich 😃



  • Oder halt die Typangabe weglassen, dann kannst du in die Liste schmeissen, was Du willst. Ist aber schlechter Stil, insofern schnell wieder vergessen. 😉


Log in to reply