method getPrevious in class List<ContentType> cannot be applied to given types

UnityFriday

Mitglied
Hallo Leute!
Ich habe eine Klasse zur Adressverwaltung programmiert und soll mithilfe des Zugriffs auf die generische Liste der Standartsicherung NRW einen Sortieralgorithmus entwickeln, um Kontakte nach Namen zu sortieren. Hierzu brauche ich an einer Stelle den Vorgänger des aktuellen Objekts. Nun wird mir aber folgende Fehlermeldung angezeigt:
method getPrevious in class List<ContentType> cannot be applied to given types;
required: List.ListNode; found: no arguments; reason: actual and formal arguments lists differ in length


Hier mein Code:
Java:
 public void sortierenNachName()
    {
        int merke=0;
        int j=0;
        telefonliste.toFirst();
        for(int i=1; i<anzahlKontakte; i++)
        {
            merke= ((Kontakt)telefonliste.getContent()).getName().charAt(0);
            j=i;
            while((j>0) && (((Kontakt)telefonliste.getPrevious()).getName().charAt(0)>merke))
            {
             
            }
        }
        }

Und hier die Methode getPrevious() aus der generischen Liste:

Java:
public ListNode getPrevious2() {
    if (current != null && current != first && !this.isEmpty()) {
      ListNode temp = first;
      while (temp != null && temp.getNextNode() != current) {
        temp = temp.getNextNode();
      }
      return temp;
    } else {
      return null;
    }
  }

Danke schonmal im Vorraus!
(Die Bilder im Anhang sind aus Versehen, wollte die Fehlermeldung eigtl. nur einmal hochladen, wusste aber nicht genau, wie das geht und wie man die entfernt. Bin noch ziemlich neu hier...)
 

Anhänge

  • Fehlermeldung.JPG
    Fehlermeldung.JPG
    26,8 KB · Aufrufe: 36
  • Fehlermeldung.JPG
    Fehlermeldung.JPG
    26,8 KB · Aufrufe: 29
  • Fehlermeldung.JPG
    Fehlermeldung.JPG
    26,8 KB · Aufrufe: 49
K

kneitzel

Gast
Hmm .. Du rufst getPrevious() auf, aber Du hast Code einer getPrevious2() Funktion gepostet....
Ist das evtl. schon der Fehler?
 

UnityFriday

Mitglied
@Thallius Es gibt noch eine andere Methode getPrevious, da muss man aber manuell ein Objekt zuordnen, dessen Vorgänger bestimmt werden soll und deshalb habe ich die ein klein wenig umgeschrieben, so dass man den Vorgänger vom aktuellen Objekt bestimmt.
@kneitzel Stimmt, ich habe mich vertippt... Mit dieser kleinen Korrektur sieht die Fehlermeldung etwas anders aus: incompatible types: List.ListNode cannot be converted to Telefonbuch.Kontakt
Also besteht das Problem leider immer noch.
 
K

kneitzel

Gast
Also da musst Du mehr Informationen liefern. Wie ist ListNode implementiert? Wie dein Kontakt? Ich nehme mal an, dass ListNode irgendwo einen Kontakt beinhaltet. Somit musst Du vom ListNode erst die Daten holen um den Kontakt zu haben. Aber ohne Details ist das nur ein raten.
 

UnityFriday

Mitglied
Tut mir leid, ListNode ist die innere Klasse der generischen Liste
Java:
/**
* <p>
* Materialien zu den zentralen NRW-Abiturpruefungen im Fach Informatik ab 2017.
* </p>
* <p>
* Generische Klasse List<ContentType>
* </p>
* <p>
* Objekt der generischen Klasse List verwalten beliebig viele linear
* angeordnete Objekte vom Typ ContentType. Auf hoechstens ein Listenobjekt,
* aktuellesObjekt genannt, kann jeweils zugegriffen werden.<br />
* Wenn eine Liste leer ist, vollstaendig durchlaufen wurde oder das aktuelle
* Objekt am Ende der Liste geloescht wurde, gibt es kein aktuelles Objekt.<br />
* Das erste oder das letzte Objekt einer Liste koennen durch einen Auftrag zum
* aktuellen Objekt gemacht werden. Ausserdem kann das dem aktuellen Objekt
* folgende Listenobjekt zum neuen aktuellen Objekt werden. <br />
* Das aktuelle Objekt kann gelesen, veraendert oder geloescht werden. Ausserdem
* kann vor dem aktuellen Objekt ein Listenobjekt eingefuegt werden.
* </p>
*
* @author Qualitaets- und UnterstuetzungsAgentur - Landesinstitut fuer Schule, Materialien zum schulinternen Lehrplan Informatik SII
* @version Generisch_03 2014-03-01
*/
public class List<ContentType> {

  /* --------- Anfang der privaten inneren Klasse -------------- */

  public class ListNode {

    private ContentType contentObject;
    private ListNode next;

    /**
     * Ein neues Objekt wird erschaffen. Der Verweis ist leer.
     *
     * @param pContent das Inhaltsobjekt vom Typ ContentType
     */
    public ListNode(ContentType pContent) {
      contentObject = pContent;
      next = null;
    }

    /**
     * Der Inhalt des Knotens wird zurueckgeliefert.
     *
     * @return das Inhaltsobjekt des Knotens
     */
    public ContentType getContentObject() {
      return contentObject;
    }

    /**
     * Der Inhalt dieses Kontens wird gesetzt.
     *
     * @param pContent das Inhaltsobjekt vom Typ ContentType
     */
    public void setContentObject(ContentType pContent) {
      contentObject = pContent;
    }

    /**
     * Der Nachfolgeknoten wird zurueckgeliefert.
     *
     * @return das Objekt, auf das der aktuelle Verweis zeigt
     */
    public ListNode getNextNode() {
      return this.next;
    }

    /**
     * Der Verweis wird auf das Objekt, das als Parameter uebergeben
     * wird, gesetzt.
     *
     * @param pNext der Nachfolger des Knotens
     */
    public void setNextNode(ListNode pNext) {
      this.next = pNext;
    }

  }

  /* ----------- Ende der privaten inneren Klasse -------------- */

  // erstes Element der Liste
  ListNode first;

  // letztes Element der Liste
  ListNode last;

  // aktuelles Element der Liste
  ListNode current;

  /**
   * Eine leere Liste wird erzeugt.
   */
  public List() {
    first = null;
    last = null;
    current = null;
  }

  /**
   * Die Anfrage liefert den Wert true, wenn die Liste keine Objekte enthaelt,
   * sonst liefert sie den Wert false.
   *
   * @return true, wenn die Liste leer ist, sonst false
   */
  public boolean isEmpty() {
    // Die Liste ist leer, wenn es kein erstes Element gibt.
    return first == null;
  }

  /**
   * Die Anfrage liefert den Wert true, wenn es ein aktuelles Objekt gibt,
   * sonst liefert sie den Wert false.
   *
   * @return true, falls Zugriff moeglich, sonst false
   */
  public boolean hasAccess() {
    // Es gibt keinen Zugriff, wenn current auf kein Element verweist.
    return current != null;
  }

  /**
   * Falls die Liste nicht leer ist, es ein aktuelles Objekt gibt und dieses
   * nicht das letzte Objekt der Liste ist, wird das dem aktuellen Objekt in
   * der Liste folgende Objekt zum aktuellen Objekt, andernfalls gibt es nach
   * Ausfuehrung des Auftrags kein aktuelles Objekt, d.h. hasAccess() liefert
   * den Wert false.
   */
  public void next() {
    if (this.hasAccess()) {
      current = current.getNextNode();
    }
  }

  /**
   * Falls die Liste nicht leer ist, wird das erste Objekt der Liste aktuelles
   * Objekt. Ist die Liste leer, geschieht nichts.
   */
  public void toFirst() {
    if (!isEmpty()) {
      current = first;
    }
  }

  /**
   * Falls die Liste nicht leer ist, wird das letzte Objekt der Liste
   * aktuelles Objekt. Ist die Liste leer, geschieht nichts.
   */
  public void toLast() {
    if (!isEmpty()) {
      current = last;
    }
  }

  /**
   * Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird das
   * aktuelle Objekt zurueckgegeben, andernfalls (hasAccess() == false) gibt
   * die Anfrage den Wert null zurueck.
   *
   * @return das aktuelle Objekt (vom Typ ContentType) oder null, wenn es
   *         kein aktuelles Objekt gibt
   */
  public ContentType getContent() {
    if (this.hasAccess()) {
      return current.getContentObject();
    } else {
      return null;
    }
  }

  /**
   * Falls es ein aktuelles Objekt gibt (hasAccess() == true) und pContent
   * ungleich null ist, wird das aktuelle Objekt durch pContent ersetzt. Sonst
   * geschieht nichts.
   *
   * @param pContent
   *            das zu schreibende Objekt vom Typ ContentType
   */
  public void setContent(ContentType pContent) {
    // Nichts tun, wenn es keinen Inhalt oder kein aktuelles Element gibt.
    if (pContent != null && this.hasAccess()) {
      current.setContentObject(pContent);
    }
  }

  /**
   * Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird ein neues
   * Objekt vor dem aktuellen Objekt in die Liste eingefuegt. Das aktuelle
   * Objekt bleibt unveraendert. <br />
   * Wenn die Liste leer ist, wird pContent in die Liste eingefuegt und es
   * gibt weiterhin kein aktuelles Objekt (hasAccess() == false). <br />
   * Falls es kein aktuelles Objekt gibt (hasAccess() == false) und die Liste
   * nicht leer ist oder pContent gleich null ist, geschieht nichts.
   *
   * @param pContent
   *            das einzufuegende Objekt vom Typ ContentType
   */
  public void insert(ContentType pContent) {
    if (pContent != null) { // Nichts tun, wenn es keinen Inhalt gibt.
      if (this.hasAccess()) { // Fall: Es gibt ein aktuelles Element.

        // Neuen Knoten erstellen.
        ListNode newNode = new ListNode(pContent);

        if (current != first) { // Fall: Nicht an erster Stelle einfuegen.
          ListNode previous = this.getPrevious(current);
          newNode.setNextNode(previous.getNextNode());
          previous.setNextNode(newNode);
        } else { // Fall: An erster Stelle einfuegen.
          newNode.setNextNode(first);
          first = newNode;
        }

      } else { //Fall: Es gibt kein aktuelles Element.

        if (this.isEmpty()) { // Fall: In leere Liste einfuegen.

          // Neuen Knoten erstellen.
          ListNode newNode = new ListNode(pContent);

          first = newNode;
          last = newNode;
        }

      }
    }
  }

  /**
   * Falls pContent gleich null ist, geschieht nichts.<br />
   * Ansonsten wird ein neues Objekt pContent am Ende der Liste eingefuegt.
   * Das aktuelle Objekt bleibt unveraendert. <br />
   * Wenn die Liste leer ist, wird das Objekt pContent in die Liste eingefuegt
   * und es gibt weiterhin kein aktuelles Objekt (hasAccess() == false).
   *
   * @param pContent
   *            das anzuhaengende Objekt vom Typ ContentType
   */
  public void append(ContentType pContent) {
    if (pContent != null) { // Nichts tun, wenn es keine Inhalt gibt.

      if (this.isEmpty()) { // Fall: An leere Liste anfuegen.
        this.insert(pContent);
      } else { // Fall: An nicht-leere Liste anfuegen.

        // Neuen Knoten erstellen.
        ListNode newNode = new ListNode(pContent);

        last.setNextNode(newNode);
        last = newNode; // Letzten Knoten aktualisieren.
      }

    }
  }

  /**
   * Falls pList null oder eine leere Liste ist, geschieht nichts.<br />
   * Ansonsten wird die Liste pList an die aktuelle Liste angehaengt.
   * Anschliessend wird pList eine leere Liste. Das aktuelle Objekt bleibt
   * unveraendert. Insbesondere bleibt hasAccess identisch.
   *
   * @param pList
   *            die am Ende anzuhaengende Liste vom Typ List<ContentType>
   */
  public void concat(List<ContentType> pList) {
    if (pList != null && !pList.isEmpty()) { // Nichts tun, wenn pList leer oder nicht existent.

      if (this.isEmpty()) { // Fall: An leere Liste anfuegen.
        this.first = pList.first;
        this.last = pList.last;
      } else { // Fall: An nicht-leere Liste anfuegen.
        this.last.setNextNode(pList.first);
        this.last = pList.last;
      }

      // Liste pList loeschen.
      pList.first = null;
      pList.last = null;
      pList.current = null;
    }
  }

  /**
   * Wenn die Liste leer ist oder es kein aktuelles Objekt gibt (hasAccess()
   * == false), geschieht nichts.<br />
   * Falls es ein aktuelles Objekt gibt (hasAccess() == true), wird das
   * aktuelle Objekt geloescht und das Objekt hinter dem geloeschten Objekt
   * wird zum aktuellen Objekt. <br />
   * Wird das Objekt, das am Ende der Liste steht, geloescht, gibt es kein
   * aktuelles Objekt mehr.
   */
  public void remove() {
    // Nichts tun, wenn es kein aktuelle Element gibt oder die Liste leer ist.
    if (this.hasAccess() && !this.isEmpty()) {

      if (current == first) {
        first = first.getNextNode();
      } else {
        ListNode previous = this.getPrevious(current);
        if (current == last) {
          last = previous;
        }
        previous.setNextNode(current.getNextNode());
      }

      ListNode temp = current.getNextNode();
      current.setContentObject(null);
      current.setNextNode(null);
      current = temp;

      //Beim loeschen des letzten Elements last auf null setzen.
      if (this.isEmpty()) {
        last = null;
      }
    }
  }

  /**
   * Liefert den Vorgaengerknoten des Knotens pNode. Ist die Liste leer, pNode
   * == null, pNode nicht in der Liste oder pNode der erste Knoten der Liste,
   * wird null zurueckgegeben.
   *
   * @param pNode
   *         der Knoten, dessen Vorgaenger zurueckgegeben werden soll
   * @return der Vorgaenger des Knotens pNode oder null, falls die Liste leer ist,
   *         pNode == null ist, pNode nicht in der Liste ist oder pNode der erste Knoten
   *         der Liste ist
   */
  public ListNode getPrevious(ListNode pNode) {
    if (pNode != null && pNode != first && !this.isEmpty()) {
      ListNode temp = first;
      while (temp != null && temp.getNextNode() != pNode) {
        temp = temp.getNextNode();
      }
      return temp;
    } else {
      return null;
    }
  }
 
 
  public ListNode getPrevious2() {
    if (current != null && current != first && !this.isEmpty()) {
      ListNode temp = first;
      while (temp != null && temp.getNextNode() != current) {
        temp = temp.getNextNode();
      }
      return temp;
    } else {
      return null;
    }
  }
}

Und das ist die Klasse Adressbuch mit der inneren Klasse Kontakt:
Java:
/**
* Das Telefonbuch dient zum Verwalten von Namen, Telefonnummern und Adressen.
* @author Uta
* @version Version 2.0, 21.01.16 - 27.01.16
*/
public class Telefonbuch
{
    private List telefonliste=new List();
    private int anzahlKontakte=0;
    /**
     * Erstellt das Telefonbuch, das wiederrum eine Telefonliste verwaltet.
     */
    public Telefonbuch()
    {
       
    }
    //Beginn der privaten inneren Klasse
    public class Kontakt
    {
        private String name;
        private String vorname;
        private String geburtsdatum;
        private String strasse;
        private String ort;
        private int plz; //plz wird durchgehend als Abkuerzung fuer Postleitzahl verwendet
      
        /**
         * Konstruktor der Klasse Kontakt
         */
        public Kontakt(String pName, String pVorname, String pGeburtsdatum, String pStrasse, String pOrt, int pPlz)
        {
            name=pName;
            vorname=pVorname;
            geburtsdatum=pGeburtsdatum;
            strasse=pStrasse;
            ort=pOrt;
            plz=pPlz;
        }
      
        public String getName()
        {
           return name;
        }
       
        public String getVorname()
        {
            return vorname;
        }
       
        public String getGeburtsdatum()
        {
            return geburtsdatum;
        }
       
        public String getOrt()
        {
            return ort;
        }
       
        public int getPlz()
        {
            return plz;
        }
       
      
       
    }
    //Ende der privaten inneren Klasse
  
    /**
     * Diese Methode erstellt einen Kontakt und fuegt ihn an die richtige Stelle ein.
     */
    public void kontaktHinzufuegen(String pName, String pVorname, String pGeburtsdatum, String pStrasse, String pOrt, int pPlz )
    {
        Kontakt neuerKontakt = new Kontakt(pName, pVorname, pGeburtsdatum, pStrasse, pOrt, pPlz);
        if(telefonliste.isEmpty()==true)
        {
            telefonliste.append(neuerKontakt);
            telefonliste.toFirst();
            anzahlKontakte++;
        }
        else
        {
           
            telefonliste.setContent(neuerKontakt);
            anzahlKontakte++;
        }
    }
   
    /**
     * Der zuletzt hinzugefuegte Kontakt wird geloescht.
     */
    public void kontaktLoeschen()
    {
      telefonliste.remove();
    }
   
    /**
     * Mit dieser Methode sollen Kontakte nach dem Nachnamen sortiert werden.
     * (man kann buchstaben vergleichen Bsp.: 'A'<'B'      
     * String.charAt()
     * selection sort, A kommt als erstes, dann B, dann C,... Evtl braeuchte man dafuer nicht einmal die Zuordnung eines Integers fuer jeden Buchstaben,
     *wenn man mit charAt einfach den Buchstaben an erster, zweiter usw. Stelle suchen kann)
     */
    public void sortierenNachName()
    {
        int merke=0;
        int j=0;
        telefonliste.toFirst();
        for(int i=1; i<anzahlKontakte; i++)
        {
            merke= ((Kontakt)telefonliste.getContent()).getName().charAt(0);
            j=i;
            while((j>0) && (((Kontakt)telefonliste.getPrevious2()).getName().charAt(0)>merke))
            {
               
            }
        }
        }
    }
 
K

kneitzel

Gast
Dann musst Du auf der ListNode<Kontakt> instanz getContentObject() aufrufen, um an den Kontakt zu kommen. So Du eine List<Kontakt> gebaut hast. Aber Du hast in der Klasse Telefonbuch eine normale List erstellt und keine generische...

Und pass mit inneren Klassen auf. Kontakt ist ja eine Entity, die Du auch ausserhalb der Klasse nutzen willst. Daher hätte ich die nicht innerhalb von Telefonbuch definiert.
 

UnityFriday

Mitglied
Ich greife von der Klasse Adressbuch auf die Liste zu und habe sie telefonliste genannt. Die generische Liste stammt auch nicht von mir, sondern wie gesagt von der Standartsicherung NRW Abiturvorgaben. Danke für den Tipp mit den inneren Klassen, aber ich wollte die Klasse Kontakt wirklich nur innerhalb dieser Modellierung nutzen und es ist realistischer, wenn man einen Kontakt hinzufügt und dabei die Attribute festlegt, fand ich.
Ich verstehe nicht so ganz, was du mit den ersten 2 Sätzen meinst... Kannst du das vllt. genauer erläutern?
 

Blender3D

Top Contributor
Wenn List<ContentType> Du Dein Telefonbuchsortierung mittels der Klasse List<ContentType> realisieren sollst, dann bedeutet das, dass deine Klasse Kontakt
1) keine innere Klasse sein sollte
2) Kontakt sollte das Interface ContentType implementieren oder falls ContentType eine Basisklasse sein sollte von dieser erben.

In der Klasse Telefonbuch folgt dann
List<Kontakt> telefonliste=new List<Kontakt>();
 

UnityFriday

Mitglied
Eigentlich ist ContentType doch die Oberklasse zu allen Objekten, nur an der Stelle, wo ich auf den Namen des Kontakts zugreifen wollte, musste ich ja typecasten. Ich habe jetzt List<Kontakt> telefonliste=new List<Kontakt>(); geschrieben und Kontakt zur einzelnen Klasse gemacht, wie du gesagt hattest, allerdings kommt immer noch diesselbe Fehlermeldung, dass Kontakt nicht in ListNode konvertiert werden kann.
 
K

kneitzel

Gast
Dann schau Dir doch bitte die Implementation der List an. Zur Lösung habe ich ja auch schon etwas geschrieben ....

Als Vergleich evtl: Du tust einen Pullover in eine Schublade von eine Schrank. Und dann nimmst du die Schublade und wunderst Dich, dass Du diese nicht anziehen kannst.
 
K

kneitzel

Gast
Ach ja - noch ein Hinweis bezüglich der public class List<ContentType>:
ContentType hat hier nichts mit einem Interface zu tun. ContentType ist hier einfache nur ein Generic. Also nichts mit Interface oder Oberklasse!

Wenn man ein Generic haben will, das eine bestimmte Oberklasse hat oder ein Interface implementiert, dann müsste geschrieben werden:
public class List<T extends OberklasseOrInterface>

Ich kenne es ansonsten auch, dass bei den Generics oft T, V, K und so geschrieben wird. Dann gibt es keine Verwechslung zu bestehenden Klassen und Interfaces.

http://openbook.rheinwerk-verlag.de/javainsel/javainsel_09_001.html und folgende Kapitel.

An dieser Stelle zur Verdeutlichung noch ein ganz schlechtes Beispiel:
Code:
public class GenericTest<String> {
    String variable;

    String getVariable() { return variable; }
    void setVariable (String variable) { this.variable = variable; }
}
Hier ist String kein String. Sondern ein Generischer Typ, der die Klasse String überschreibt.

Kann man dann auch testen:
Code:
public static void main(String[] args) {
    GenericTest<Integer> myTest = new GenericTest<>();
    myTest.setVariable(100);
    System.out.println(myTest.getVariable().getClass().getSimpleName());
}
Hier ist dann die Ausgabe auch "Integer" und nicht String und das lässt sich auch problemlos kompilieren.

Und wenn ich in dem List<String> Code die Klasse String nutzen wollte, dann ginge dies über die Angabe des Namespaces - also z.B. über
Code:
java.lang.String stringVariable;

Das aber nur zur Verdeutlichung und es sollte offensichtlich sein, dass es ein ganz schlechter Stil ist.

Und noch ein Hinweis: Es ist super, wenn die Entwicklungsumgebung hilft und Dinge einfärbt. So macht IntelliJ Generic Typen bei mir Hellblau, was das dann verdeutlicht. Normale Klassen sind einfach nur schwarz.

Konrad
 
Zuletzt bearbeitet von einem Moderator:

Blender3D

Top Contributor
Ich würde das so machen: Habe die Klasse List für Testzwecke um die Methode toString erweitert.
Code:
     List<X>{
     ...
    @Override
    public String toString() {
        String tmp = "";
        String nl = System.getProperty("line.separator");
        ListNode save = current;
        current = first;
        while (current != null) {
            tmp += current.getContentObject().toString() + nl;
            next();
        }
        current = save;

        return tmp;
    }


Code:
public class Kontakt {
    private String vorname;
    private String nachname;

    public Kontakt(String nachname, String vorname) {
        this.nachname = nachname;
        this.vorname = vorname;
    }
    public Kontakt(Kontakt k){
        this.vorname = k.getVorname();
        this.nachname = k.getNachname();
    }
    public String getNachname() {
        return nachname;
    }
    public String getVorname() {
        return vorname;
    }
    public void setNachname(String nachname) {
        this.nachname = nachname;
    }
    public void setVorname(String vorname) {
        this.vorname = vorname;
    }
    @Override
    public String toString() {
        return nachname + " " + vorname;
    }
}

Code:
public class Telefonbuch {
    private List<Kontakt> l = new List<Kontakt>();
    private int size = 0;
    /**
     * Sortiertes einfügen in das Telefonbuch.
     *
     * @param k
     */
    public void add(Kontakt k) {
        if (l.isEmpty()) { // 1 Element
            l.append(k);
            size = 1;
            return;
        }
        // gehe solange durch die Liste bis der gefundene Eintrag größer als der
        // neue ist oder das Ende ereicht ist. Am Ende anhängen sonst einfügen.
        // Bei doppeltem eintrag mach nichts.
        l.toFirst();
        while (l.hasAccess()) {
            Kontakt tmp = l.getContent();
            int cmp = tmp.toString().compareTo(k.toString());
            if (cmp == 0) // double entry
                return;
            if (cmp < 0) {
                l.next();
                if (l.hasAccess())
                    continue;
                else { // last element
                    size++;
                    l.append(k);
                    return;
                }
            }
            l.insert(k);
            size++;
            return;
        }
    }
    public int size() {
        return size;
    }
    @Override
    public String toString() {
        return l.toString();
    }
}

Code:
public static void main(String[] args) {
        Telefonbuch b = new Telefonbuch();
        String namen[][] = { { "Angerer", "Paul" }, { "Xaltus", "Hans" }, { "Auer", "Sabine" } };
        for (int i = 0; i < namen.length ; i++) {
            Kontakt k1 = new Kontakt(namen[i][0], namen[i][1]);
            b.add(k1);
        }
        System.out.println(b);
    }
 

UnityFriday

Mitglied
@Konrad Dann habe ich wohl vorher was falsch verstanden... Also ich dachte immer, dass bei dieser generischen Liste sämtliche Inhalte als ContentType eingespeichert werden können. Also geht das doch nicht?
@Blender3D Finde ich echt nett, dass du dir solche Mühe machst und das alles einmal implementiert hast, aber da das ein Informatikprojekt für die Schule ist, würde ich das schon gerne selbstständig machen.
Also muss ich im Prinzip alles nochmal umschmeißen, wie ich das verstanden habe, oder?
 
K

kneitzel

Gast
Bei der Erstellung der Instanz gibst Du den Typ an, den Du haben möchtest. Also z.B. new List<Kontakt> um Instanzen von Kontakt zu speichern. Aber bei der Implementation von List selbst kannst Du einen beliebigen Namen verwenden... Üblich sind T oder K,V bei key/value.
 

Blender3D

Top Contributor
.Ja ContentType ist nur ein Platzhalter für die konkrete Klasse in der Liste die letztendlich benutzt wirtd. Der Sinn von generischen Datenstrukturen ist, dass man die benutzte Logik nicht für jeden Datentyp immer wieder neu implementieren muss. Hier ist irreführend, dass als Platzhalter der Name ContentType, statt X oder T usw. gewählt wurde .


Ich wollte Dir Deine Arbeit nicht abnehmen. Der obige Code stellt nur ein Beispiel dar, wie man mit der vorgegebenen Liste eine Sortierung realisieren könnte. Innhaltlich macht es z.B. für ein Telefonbuch keinen Sinn, Kontakte einzufügen und diese dann durch den Aufruf einer Methode sort zu sortieren. Deshalb habe ich die Sortierung bei der Methode add realisiert.

Ich finde, diese Dir vorgegebene List, ist nicht wirklich gut gelöst, da die Methode 'ListNode getPrevious( ListNode n )'
1) einen ListNode als Eingabe erwartet und gleichzeitig die einzige Methode ist die selbst einen ListNode zurückgibt, der außerdem eine innere Klasse ist.
2) läuft sie bei jedem Aufruf die gesammte List durch ,um zu den Vorgänger zu gelangen. ( -> schlechtes Laufzeitverhalten, O Notation )

Der einzige vernünftige Gebrauch der Liste, um zu sortieren, ist sortieren durch Einfügen.
 

UnityFriday

Mitglied
Natürlich, ist auch nachvollziehbar, die Aufgabenstellung, die ich evtl. hätte besser erklären sollen, hieß, dass es einmal eine Methode geben soll, mit der die Kontakte nach versch. Attributen sortiert werden können und dass beim Einfügen eines Kontaktes dieser gleich an die richtige Stelle einsortiert wird.
 

UnityFriday

Mitglied
zu der generischen Liste, die ich hier verwendet habe: Da sie zu den Abiturvorgaben gehört, MÜSSEN wir sie leider verwenden, heißt, mir bleibt gar keine andere Wahl. Für diese Aufgabe hätte ich natürlich gerne eine doppelt verkettete Liste, aber ich finde dazu keine Vorlagen und traue mir nicht zu, diese selbst zu programmieren.
 

Blender3D

Top Contributor
Da die Aufgabenstellung die Benutzung dieser Liste voraussetzt, sollst Du diese auch verwenden. Hier gehts wohl, eher darum mit bestehenden Datenstrukturen umzugehen und diese zu verstehen. Wichtig ist auch das Verständnis von generischen Typen.
 

UnityFriday

Mitglied
ok, noch mal eine Frage, zu der ich weder hier im Forum, noch bei Google was gefunden hab: gibt es eigtl einen Rückgabewert für Methoden, die nur Attribute und null zurückgeben? Sorry, wenn das jetzt anscheinend nicht zum Thema passt...
 
K

kneitzel

Gast
Kannst Du die Frage etwas anders formulieren? Ich verstehe derzeit nicht, was Du mit "nur Attribute und null zurückgeben"? Du kannst eine Klasse erstellen, in denen Du "Attribute" speicherst und dann kann eine Methode eine Instanz dieser Klasse oder eben null zurück geben. Meinst Du das?

Konrad
 

UnityFriday

Mitglied
Ups, ne ich meine, ob es neben int, String usw als Rückgabewerte auch einen Wert gibt, mit dem man ein Attribut zurückgibt, hier eine Methode, wo ich das gerne tun würde:
Java:
/**
   * Liefert den Vorgaengerknoten des Knotens pNode. Ist die Liste leer, pNode
   * == null, pNode nicht in der Liste oder pNode der erste Knoten der Liste,
   * wird null zurueckgegeben.
   *
   * @param pNode
   *         der Knoten, dessen Vorgaenger zurueckgegeben werden soll
   * @return der Vorgaenger des Knotens pNode oder null, falls die Liste leer ist,
   *         pNode == null ist, pNode nicht in der Liste ist oder pNode der erste Knoten
   *         der Liste ist
   */
  public ListNode getPrevious(ListNode pNode) {
    if (pNode != null && pNode != first && !this.isEmpty()) {
      ListNode temp = first;
      while (temp != null && temp.getNextNode() != pNode) {
        temp = temp.getNextNode();
      }
      return temp;
    } else {
      return null;
    }
  }
 

UnityFriday

Mitglied
Ups, ne ich meine, ob es neben int, String usw als Rückgabewerte auch einen Wert gibt, mit dem man ein Attribut zurückgibt, hier eine Methode, wo ich das gerne tun würde:
Java:
/**
   * Liefert den Vorgaengerknoten des Knotens pNode. Ist die Liste leer, pNode
   * == null, pNode nicht in der Liste oder pNode der erste Knoten der Liste,
   * wird null zurueckgegeben.
   *
   * @param pNode
   *         der Knoten, dessen Vorgaenger zurueckgegeben werden soll
   * @return der Vorgaenger des Knotens pNode oder null, falls die Liste leer ist,
   *         pNode == null ist, pNode nicht in der Liste ist oder pNode der erste Knoten
   *         der Liste ist
   */
  public ListNode getPrevious(ListNode pNode) {
    if (pNode != null && pNode != first && !this.isEmpty()) {
      ListNode temp = first;
      while (temp != null && temp.getNextNode() != pNode) {
        temp = temp.getNextNode();
      }
      return temp;
    } else {
      return null;
    }
  }

Ich würde hier als Rückgabewert statt ListNode lieber etwas "allgemeiners" haben, verstehst du?
 

UnityFriday

Mitglied
Ups, ne ich meine, ob es neben int, String usw als Rückgabewerte auch einen Wert gibt, mit dem man ein Attribut zurückgibt, hier eine Methode, wo ich das gerne tun würde:
Java:
/**
   * Liefert den Vorgaengerknoten des Knotens pNode. Ist die Liste leer, pNode
   * == null, pNode nicht in der Liste oder pNode der erste Knoten der Liste,
   * wird null zurueckgegeben.
   *
   * @param pNode
   *         der Knoten, dessen Vorgaenger zurueckgegeben werden soll
   * @return der Vorgaenger des Knotens pNode oder null, falls die Liste leer ist,
   *         pNode == null ist, pNode nicht in der Liste ist oder pNode der erste Knoten
   *         der Liste ist
   */
  public ListNode getPrevious(ListNode pNode) {
    if (pNode != null && pNode != first && !this.isEmpty()) {
      ListNode temp = first;
      while (temp != null && temp.getNextNode() != pNode) {
        temp = temp.getNextNode();
      }
      return temp;
    } else {
      return null;
    }
  }

Ich würde hier als Rückgabewert statt ListNode lieber etwas "allgemeineres" haben, verstehst du?
 

Blender3D

Top Contributor
Du meinst das zurückgegebene Object? z.B. Kontakt findeKontakt( string name );
Da ist der Rückgabewert das Object Kontakt oder null.
 

Blender3D

Top Contributor
Allgemeiner wäre Object. Oder du baust Dir so etwas.
Code:
interface Iterator<T> {
  public T next ();
  public T previous();
  public boolean hasNext ();
  public boolean hasPrevious();
}
 

UnityFriday

Mitglied
mal ne ganz blöde Frage: was bedeutet eigtl Interface in dem Zusammenhang, habe das jetzt schon öfter gelesen, aber weiß nicht genau, wie das gemeint ist...
 

Blender3D

Top Contributor
Interface ist das Versprechen, dass die Klasse die das Interface implementiert, die dort beschriebenen Funktionen zur Verfügung stellt, also eine Schnittstelle die garantiert wird.
Das bedeutet, die Liste hätte eine Methode: Iterator<T> getIterator(); Mit den Methoden next() und previouse() kann man dann die Liste in beiden Richtungen durchsuchen.
 

Blender3D

Top Contributor
Hier ein Codeschnipsel wie man den Iterator verwendet.
Code:
List<Kontakt> list = new List<Kontakt>();
list.add( new Kontakt( "Peter", "Hannsen" ) );
....
Iterator<Kontakt> it = list.getIterator();
while( it.hasNext() ){
Kontakt k = it.next();
...
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R finaler Wert in outerMethod von method in InnerMethodClass Java Basics - Anfänger-Themen 2
S Methoden 2 non-static Methoden, trotzdem Fehler "non static method can not be referenced from a static context" Java Basics - Anfänger-Themen 9
P myClass?.method() in Java Java Basics - Anfänger-Themen 4
T setFill method Java Basics - Anfänger-Themen 3
H Methode mit Array als Rückgabe This method must return a result of Type int[] Java Basics - Anfänger-Themen 2
N The method setSaldo(double) in the type Konto is not applicable for the arguments (int, int) Java Basics - Anfänger-Themen 2
A startsWith method und substring Java Basics - Anfänger-Themen 2
W Remote Method Invocation RMI - Problem Java Basics - Anfänger-Themen 0
I Java Generics factory method Java Basics - Anfänger-Themen 2
V the static method should be accessed is a static way Java Basics - Anfänger-Themen 6
N Erste Schritte "non-static method" oder "XYZ can not be resolved" Java Basics - Anfänger-Themen 21
K Eigene Annotations, Pre-/Post-/Call-Method Java Basics - Anfänger-Themen 6
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
G Was als main Method Java Basics - Anfänger-Themen 6
M Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 10
E Array to String Method Reverse Java Basics - Anfänger-Themen 5
D Methoden undefined method Java Basics - Anfänger-Themen 13
S Method mit Eingabe abrufen Java Basics - Anfänger-Themen 1
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
U Method References Java Basics - Anfänger-Themen 1
P Variablen einer Methode in andere Method übergeben Java Basics - Anfänger-Themen 6
B Methoden The method mirror(double[]) in the type Convolution is not applicable for the arguments (double) Java Basics - Anfänger-Themen 8
J easy remove method Java Basics - Anfänger-Themen 1
M abstract method does not override or implement.... Java Basics - Anfänger-Themen 7
R The method printf(String, Object[]) in the type printStrem in not applicable for the arguments ... Java Basics - Anfänger-Themen 3
M Deklaration und Initialisierung bei Method Erstellung Java Basics - Anfänger-Themen 12
K Variablen RETURN in Case-Switch / This method must return a result of type Item Java Basics - Anfänger-Themen 4
W Compiler-Fehler "non-static method cannot be referenced"-Problem Java Basics - Anfänger-Themen 6
K String equalIgnoreCase() Method Java Basics - Anfänger-Themen 19
E non-static method und static context Java Basics - Anfänger-Themen 15
L Command Prompt / Main Method / String Java Basics - Anfänger-Themen 9
M Methoden "Non-static method xy cannot be referenced from a static context" Java Basics - Anfänger-Themen 20
T selection method does not contain a main type Java Basics - Anfänger-Themen 7
U UML Factory Method Java Basics - Anfänger-Themen 4
R Compiler-Fehler Cannot find symbol (Method printIn) Java Basics - Anfänger-Themen 3
H non-static method cannot be referenced from a static context Java Basics - Anfänger-Themen 2
L Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 6
B Object "Method" in TreeSet, Fehler beim Vergleichen/Comparable Java Basics - Anfänger-Themen 9
M Problem mit Static Method Java Basics - Anfänger-Themen 8
W Main-method in Object-classes Java Basics - Anfänger-Themen 5
J Compiler findet method nicht Java Basics - Anfänger-Themen 12
M This method must return a result of type int Java Basics - Anfänger-Themen 13
M Fehlermeldung: the method.... ist undefined for the type object Java Basics - Anfänger-Themen 6
S this method must return a result of type double Java Basics - Anfänger-Themen 2
G Collections.binarySearch(LinkedList): cannot find method Java Basics - Anfänger-Themen 6
Y Theorie: Abstract Method Java Basics - Anfänger-Themen 6
C Methoden numberField.getDouble no such method error Java Basics - Anfänger-Themen 4
F Mal wieder: Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 9
F Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 3
Q non-static method blub cannot be referenced from a static context Java Basics - Anfänger-Themen 6
E Netbeans, "class does not have a main method" Java Basics - Anfänger-Themen 8
L no such method error: main() Java Basics - Anfänger-Themen 2
O Abstract Method & Generics Java Basics - Anfänger-Themen 10
N public class -> public method -> variable private? Java Basics - Anfänger-Themen 10
R Could not find main method Java Basics - Anfänger-Themen 3
U Boolean istGleich() Method Java Basics - Anfänger-Themen 15
Luk10 method () not found Java Basics - Anfänger-Themen 9
A OOP Fehler non-static method can not be[...] Java Basics - Anfänger-Themen 2
N Reference to non-static method Java Basics - Anfänger-Themen 8
G non static method scale(int,int) cannot be referenced from a static context Java Basics - Anfänger-Themen 16
A The method getYear() from the type Date is deprecated Java Basics - Anfänger-Themen 6
A cannot find symbol - symbol : method Java Basics - Anfänger-Themen 5
S The method readInt() Problem Java Basics - Anfänger-Themen 5
E method undefined - wo ist der Fehler? Java Basics - Anfänger-Themen 5
J non static method cannot be referenced from static context Java Basics - Anfänger-Themen 7
L cannot find symbol-method Java Basics - Anfänger-Themen 3
D kleine Passwortabfrage erstellen incl. Method zum verändern Java Basics - Anfänger-Themen 7
S Mein Quicksort Problem: he method quickSort(int[], int, int) Java Basics - Anfänger-Themen 2
M Invalid Method Java Basics - Anfänger-Themen 7
F does not overwride abstract method Java Basics - Anfänger-Themen 2
C Fehler: non-static method Java Basics - Anfänger-Themen 5
B method intValue() is undefined for the type String (?) Java Basics - Anfänger-Themen 4
R Cannot make a static reference to the non-static method Java Basics - Anfänger-Themen 5
G String zu Method Java Basics - Anfänger-Themen 11
B cannot find symbol method equalsIgnoreCase? Java Basics - Anfänger-Themen 23
T Does not have a main method ? GGT. Java Basics - Anfänger-Themen 4
N invalid method declaration; return type required Java Basics - Anfänger-Themen 4
T this method.is not visible Java Basics - Anfänger-Themen 3
C overridden method does not throw java.io.IOException Java Basics - Anfänger-Themen 4
R non-static method execute Java Basics - Anfänger-Themen 3
J Morgen Java-Klausur. Stack, Heap, Method-Area Java Basics - Anfänger-Themen 2
V Non Static Method. Java Basics - Anfänger-Themen 2
S Method undefinded for "Klasse" Java Basics - Anfänger-Themen 4
R Eclipse: This method must return a result of type double. Java Basics - Anfänger-Themen 2
M Fehlermeldung (The method contains(String) is. Java Basics - Anfänger-Themen 3
M Fehlermeldung (the method add(OE) in the type Abteilung.) Java Basics - Anfänger-Themen 2
N ActionListener versch. Buttons zuweisen => versch. Method Java Basics - Anfänger-Themen 13
T method <init> not found in class . Java Basics - Anfänger-Themen 4
G Problem (oder Verständnisporblem) bei einer static method Java Basics - Anfänger-Themen 9
frau-u Altes Problem: non-static method cannot be reference Java Basics - Anfänger-Themen 7
M Solaris - Method Split Fehler Java Basics - Anfänger-Themen 2
M method xxx() from the type xxx is deprecated Java Basics - Anfänger-Themen 3
A Method.invoke() mit geerbten Methoden Java Basics - Anfänger-Themen 2
A The method getClass() from the type saveLog is not static Java Basics - Anfänger-Themen 2
G Abstract Class - Abstract Method Java Basics - Anfänger-Themen 4
R Could not find Main-Method Java Basics - Anfänger-Themen 4
T IntelliJ / SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". Java Basics - Anfänger-Themen 4
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Class scope und Instance scope und Getter nur selbstgeschrieben Methoden Java Basics - Anfänger-Themen 11
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben