Listenimplementierungen

Status
Nicht offen für weitere Antworten.
M

mausi

Gast
kann man innerhalb eines Programmes mit verschiedenen Listenimplementierungen arbeiten??? Z.Bsp. mit ArrayList und PointerList???
 

L-ectron-X

Gesperrter Benutzer
<abstract>Kann man in einem Programm mit verschiedenen Objekten arbeiten?</abstract>
Klar! :wink: Was ist Dein Problem?
 
M

mausi

Gast
und wie macht man das

hier mal meine ListMain
Code:
public class ListMain {

  /**
   * @param argv - Parameter bei Programmstart
   */
  public static void main(String[] argv) {

    PointerListT l1 = new PointerListT();
    PointerListT l2 = new PointerListT();

    for (int i = 0; i < 10; i++) {
      l1.append(new IntElemT(i));
      l1.append(new IntElemT(i));
    }
    for (int i = 0; i < 10; i++) {
      l1.append(new IntElemT(i));
    }
    for (int i = 0; i < 23; i = i + 3) {
      l2.append(new IntElemT(i));
    }
    System.out.println("before purge: " + l1.toString());
    ListOperations.purge(l1);
    System.out.println("after purge: " + l1.toString());

    System.out.println("before union l1: " + l1.toString());
    System.out.println("before union l2: " + l2.toString());
    ListOperations.union(l1, l2);
    System.out.println("after union l1: " + l1.toString());

  } // main

} // class PurgeMain
 
M

mausi

Gast
hui schon abgeschickt "verklickt"
jedenfalls hier benutzt der die PointerListT Implementierung und wie mache ich das wenn er beide benutzt?
 
M

mausi

Gast
ListMain is das Hauptmodul
und noch ma konkret die Aufgabe
"Können Sie auch innerhalb eines Porgrammes mit verschiedenen Listenimplementierungen arbeiten?Passen Sie das Hauptmodul entsprechend an!"
wie versteht ihr denn die aufgabe?
 

L-ectron-X

Gesperrter Benutzer
Wenn es nicht gehen würde, bräuchtest Du nix anpassen. :wink:
Du kannst in Programmen mit beliebigen Objekten arbeiten. Also auch mit zwei oder mehreren List-Implementierungen. In Deinem Programm arbeitest Du bisher so weit ich das sehen kann nur mit einer Implementierung. Du hast zwei Referenzen auf zwei Objekte (Instanzen) von PointerListT. Du fügst Daten hinzu und gibst sie nach "Reinigung" wieder aus. Mehr bisher nicht.
 

Bleiglanz

Gesperrter Benutzer
Code:
    PointerListT l1 = new PointerListT();
    PointerListT l2 = new PointerListT();
Wenn PointerList eine Unterklasse von einer Oberklasse oder eine Implementierung eines Interfaces (z.B. KaeseList) ist, dann solltest du einfach
Code:
    KaeseListT l1 = new PointerListT();
    KaeseListT l2 = new PointerListT();
schreiben, aber bei einem Aufruf mit new ist das ziemlich witzlos (lustiger wäre eine Factory!), wie überhaupt die ganze Idee bei einem Programm mit einer einzigen main...
 
M

mausi

Gast
so geht es aber nicht weil
ListMain.java:13: incompatible types
found : PointerListT
required: ArrayListT
ArrayListT l1 = new PointerListT();
^
ListMain.java:14: incompatible types
found : PointerListT
required: ArrayListT
ArrayListT l2 = new PointerListT();
^
2 errors
 

Bleiglanz

Gesperrter Benutzer
na toll, WAS IST PointerListT?????

ausserdem musst du dann java.util.List verwenden UND NICHT java.util.ArrayList (das wäre ja total doof, dann würdest du dich ja doch wieder an eine Implementierung binden, du willst ja gerade "generisch" sein...)
 
B

bygones

Gast
du kannst nicht Klassen vermischen, die nichts miteinander zu tun haben - daher der Fehler....

wie Bleiglanz sagte, wenn Klasse A Superklasse von B ist kannst du schreiben
Code:
 A what = new B();

dein Problem ist das perfekte Bsp, dass man immer, wenn ein übergeordnetes Interface vorhanden ist, dieses nehmen sollte und nicht eine implementierende Klasse, d.h.

Code:
List list = new ArrayList();
// mach was mit der List
ob du nun schreibst new ArrayList() oder z.b. new Vector() ist für das Programm schnuppe, da es nur über das Interface List weiterarbeitet !
 
M

mausi

Gast
ja eben...und deswegen kann man nicht verschiedene Listenimplementierungen in einem Programm benutzen oder?
 
M

mausi

Gast
so das is die Ausgabe wenn ich ArrayList und PointerList benutze

>Exit code: 0
>java ListMain
before purge: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 0 1 2 3 4 5 6 7 8 9
after purge: 0 1 2 3 4 5 6 7 8 9
before union l1: 0 1 2 3 4 5 6 7 8 9
before union l2: <0, 3, 6, 9, 12, 15, 18, 21>
Exception in thread "main" java.lang.ClassCastException: ArrayListT$ArrayListIteratorT
at PointerListT.connect(PointerListT.java:171)
at ListOperations.union(ListOperations.java:64)
at ListMain.main(ListMain.java:32)
>Exit code: 1
Code:
    PointerListT l1 = new PointerListT();
      ArrayListT l2 = new ArrayListT();
 
M

mausi

Gast
habs raus das die aufgaben aber auch immer so missverständlich gestellt werden... :x

also
Code:
public class ListMain {

  /**
   * @param argv - Parameter bei Programmstart
   */
  public static void main(String[] argv) {

    PointerListT l1 = new PointerListT();
    PointerListT l2 = new PointerListT();
    ArrayListT l3 = new ArrayListT();
    ArrayListT l4 = new ArrayListT();

    for (int i = 0; i < 10; i++) {
      l1.append(new IntElemT(i));
      l1.append(new IntElemT(i));
      l3.append(new IntElemT(i));
      l3.append(new IntElemT(i));        
    }
    for (int i = 0; i < 10; i++) {
      l1.append(new IntElemT(i));
      l3.append(new IntElemT(i));
              
    }
    for (int i = 0; i < 23; i = i + 3) {
      l2.append(new IntElemT(i));
      l4.append(new IntElemT(i));        
    }
    System.out.println("before purge: " + l1.toString());
    ListOperations.purge(l1);
    System.out.println("before purge: " + l3.toString());
    ListOperations.purge(l3);
    System.out.println("after purge: " + l1.toString());
    System.out.println("after purge: " + l3.toString());

    System.out.println("before union l1: " + l1.toString());
    System.out.println("before union l2: " + l2.toString());
    System.out.println("before union l3: " + l3.toString());
    System.out.println("before union l4: " + l4.toString());    
    ListOperations.union(l1, l2);
    ListOperations.union(l3, l4);    
    System.out.println("after union l1: " + l1.toString());
    System.out.println("after union l3: " + l3.toString());
  } // main

} // class PurgeMain
dann is so die Ausgabe
>java ListMain
before purge: 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 0 1 2 3 4 5 6 7 8 9
before purge: <0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
after purge: 0 1 2 3 4 5 6 7 8 9
after purge: <0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
before union l1: 0 1 2 3 4 5 6 7 8 9
before union l2: 0 3 6 9 12 15 18 21
before union l3: <0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
before union l4: <0, 3, 6, 9, 12, 15, 18, 21>
after union l1: 0 1 2 3 4 5 6 7 8 9 12 15 18 21
after union l3: <0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 15, 18, 21>
>Exit code: 0
und somit können verschiedene Listenimplementierungen in einem Programm benutzt werden
 

Bleiglanz

Gesperrter Benutzer
und somit können verschiedene Listenimplementierungen in einem Programm benutzt werden

kopfschüttel? was hat das mit Listen zu tun? Du kannst Objekte verschiedener Klassen in einer Methode mit new erzeugen und verschiednen Variablen zuweisen - HURRA

Ist ListOperations.purge() überladen oder erwartet es ein Interface, darum gehts doch?
 
G

Guest

Gast
Ich weiss... habe aber keine Ahnung wie es anders gehen soll,ich soll meine connect Methode ändern hab ich gesagt bekommen
Code:
 public void connect(ListT l) {
      if (!(l instanceof ArrayListT)) {
          System.err.println("connect(): expected class:ArrayList, got:"
          +l.getClass().getName());
	      System.exit(1);
	    } else {
            ArrayListT al = (ArrayListT) l;
	        if (size + al.size > maxSize) {
                System.err.println("connect(): overflow");
		        System.exit(1);
            } // if
	        for(int i = 0; i < al.size; i++) {
		        contents[i + size] = al.contents[i].copy();
	        } // for
	        size = size + al.size;
        }// else
	}// connect
und zwar:schreibe deine connect Mthoden so um, dass sie allgemeine (also ListT
Methoden verwenden (lass die Überprüfung obs der selbe Typ ist) und
verwende den Iterator - dann kannst du auch verschiedene Listen
verknüpfen. Dann gibst du in der main Methode noch den richtigen Typ an
(den beide Listen gemeinsam haben (also warum haben sie den die gleichen
Methoden?). That's it. Versuch's doch noch mal.


hmmm da weiss ich jetzt auch nicht
 

Bleiglanz

Gesperrter Benutzer
du sollst es so machen
Code:
 public void connect(ListT l) {
           if (size + al.size > maxSize) {
                System.err.println("connect(): overflow");
                System.exit(1); //// BÄHHHHH, nimm ne exception
            } 
           for(int i = 0; i < al.size; i++) {
              contents[i + size] = al.contents[i].copy();
           } // for
           size = size + al.size;
   }// connect
wenn ListT eine size() und contents? methode hat

bleibt die Frage WAS IST ListT?

ist contents ein öffentliches Array (BÄH!!)?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben