# Java List Suchen mit eigenem Generischen Datentyp



## Slaylen (26. Jan 2021)

Ich schreibe im Moment meine Facharbeit in Informatik der 11 Klasse und hab mir eine Art Vokabel "Trainer" zum Programmieren ausgesucht. Ich habe eine priorities eingebaut die ich mit den Strings "low" "high" umgesetzt habe. Der Vokabel Kartei, in der alle Vokabeln gespeichert sind, ist eine liste mir dem Datentyp Vok (vokabel). Die Klasse Vokabel sieht wie folgt aus;

public class *Vokabel*
[CODE lang="java" title="Vokabel"]public class Vokabel
{
    String Vok;
    List Übersetzungliste;
    String Prio;

    public Vokabel(String pVok, String pÜb){
     Vok = pVok;
     Übersetzungliste = new List();
     Übersetzungliste.append(pÜb);
    }

    public void neuÜbersetzung(String pÜb){
     Übersetzungliste.append(pÜb);
    }

    public void Vokabeländern(String pNeuVok){
     String pRemember = Vok;
     Vok = pNeuVok;
     System.out.println("Die Vokabel " + pRemember + " wurde zu " + Vok + " geändert.");
    }

    public String Vokabel(){
     return Vok;
    }

    public List Übersetzung(){
     return Übersetzungliste;
    }

    public void Überlöschen(String pSuche){
     if(!Übersetzungliste.isEmpty()){
       Übersetzungliste.toFirst();
        while( Übersetzungliste.current.content() != pSuche)
         Übersetzungliste.next();
         Übersetzungliste.remove();
     }
    }

    public String getPrio(){
     return Prio;
    }

    public void setPrio(String pPrio){
     Prio = pPrio;   
    }

}
[/CODE]

*Die Klasse Kartei:
(meine priorität)*
[CODE lang="java" title="Kartei"] import java.lang.Math;

public class Kartei
{
   private List karteiliste;

   public Kartei(){
    karteiliste = new List();
   }

   public void VokabelPlus(Vokabel pVok){
    karteiliste.append(pVok);
   }

   public void VokabelLöschen(String pSuche){
    while(karteiliste.current.content() != pSuche)
     karteiliste.next();
     karteiliste.remove();
   }

   public int VokabelAnzahl(){
    karteiliste.toFirst();
    karteiliste.next();
    int i = 0;
    while(karteiliste.current != karteiliste.first){
     karteiliste.next();
     i++;
    }
    i++;
    return i;
   }

   public Object Vokabelausgabe(){
    int b = 0;
    int max = VokabelAnzahl();
    int min = 1;
    int range = max - min + 1;
    int rZahl = (int)(Math.random() * range) + min;
    while( b != rZahl){
     karteiliste.next();
     b++;
    }
    String a = "low";
    String j = "high";
    if(karteiliste.current.content() == a){
        int max2 = 5;
        int min2 = 1;
        int range2 = max - min + 1;
        int rZahl2 = (int)(Math.random() * range) + min;
          if(rZahl2 != 5){
            SuchePrio(j);
           }
    }
    return karteiliste.current.content();
   }

  public Object SucheÜbersetzung(String pSuche){
    karteiliste.toFirst();
        while(karteiliste.Übersetzung() != pSuche){
       karteiliste.next();
     }
    return karteiliste.current.content();
   }

   public Object SucheVok(String pSuche){
    karteiliste.toFirst();
     while(karteiliste.current.content() != pSuche){
      karteiliste.next();   
     }
    return karteiliste.current.content();
   }

   public Object SuchePrio(String pSuche){
    karteiliste.toFirst();
    while(karteiliste.current.content() != pSuche){
     karteiliste.next();
    }
    return karteiliste.current.content();
   }
}[/CODE]
*Erklärung:*
falls die Vokabel die priorität "low" hat wird eine neue Vokabel gesucht ( hier habe ich eine Wahrscheinlichkeit eingebaut die ist aber voll funktionstüchtig). Die Methode SuchePrio funktioniert jedoch nicht, da der current mir nur die Vokabel ausgibt ich aber einen bestimmten String in der Vokabel brauche.

PS. Das  ist mein erster Beitrag in einem Forum und ich hab Informatik seid Anfang diesem schuljahres 2020 Informatik, ich hoffe es sind nicht zu viele schreib fehler da und man kann wenigstens ein bisschen verstehen was mein Problem ist.


----------



## MoxxiManagarm (26. Jan 2021)

Kannst du den Code bitte in Java Tags setzen? Erstes Symbol bei den Tool `</>`


----------



## kneitzel (26. Jan 2021)

Strings vergleicht man mit equals und nicht mit == (bzw. != wie in karteiliste.current.content() != pSuche)


----------



## Slaylen (26. Jan 2021)

MoxxiManagarm hat gesagt.:


> Kannst du den Code bitte in Java Tags setzen? Erstes Symbol bei den Tool `</>`


ok ich versuchs ^^


----------



## Slaylen (26. Jan 2021)

kneitzel hat gesagt.:


> Strings vergleicht man mit equals und nicht mit == (bzw. != wie in karteiliste.current.content() != pSuche)


wie würde es denn mit equals aussehen (hatte ich noch nicht)?


----------



## kneitzel (26. Jan 2021)

Aus `karteiliste.current.content() != pSuche` würde `!karteiliste.current.content().equals(pSuche)` werden.

Aber content() liefert auch ein Object - ist das überhaupt ein String? Der Vergleich macht nur Sinn, wenn das auch ein String ist! Das Design sieht mehr wie fragwürdig aus je mehr ich mir das ansehe


----------



## Slaylen (26. Jan 2021)

kneitzel hat gesagt.:


> Aus `karteiliste.current.content() != pSuche` würde `!karteiliste.current.content().equals(pSuche)` werden.
> 
> Aber content() liefert auch ein Object - ist das überhaupt ein String? Der Vergleich macht nur Sinn, wenn das auch ein String ist! Das Design sieht mehr wie fragwürdig aus je mehr ich mir das ansehe


darum geht es ich möchte dass mir ein String aus der Vokabel (klasse / datentyp) ausgegeben wird und nicht ein Object, ich weiß aber nicht wie ich das mit dem current umsetzen soll, ob das damit geht geschweige denn möglich ist


----------



## kneitzel (26. Jan 2021)

Wenn content() eine Vokabel zurück gibt, dann kannst Du einen Cast machen.... Aber Du solltest generell typsicher entwickeln -> List also mit Generics (als Beispiel) bzw. statt einer eigenen Klasse List dann java.util.List verwenden.

Mit cast kannst Du so auf Getter zugreifen:
`((Vokabel) karteiliste.current.content()).getSomething()`

Aber wenn das ein String zurück gibt, bleibt der Punkt mit dem equals natürlich bestehen ...

Und der Aufruf sieht schlimm aus - current ist ein Implementationsdetail der Liste - darauf sollte es keinen Zugriff geben.


----------



## Slaylen (26. Jan 2021)

Vielen Dank ^^
hättest Du eine erklärung zu Cast / java.uti.List ( Video Erklärung auf anderweitigen Seiten) parat, denn von beidem habe ich noch nie etwas gehört ,ich versuche dennoch diesen teil einzubauen und nochmals danke ^^


----------



## kneitzel (26. Jan 2021)

Also bezüglich Listen und so:


			EinfÃ¼hrung in die nebenlÃ¤ufige Programmierung
		


Bezüglich Typen und das casten:





						Openbooks. Rheinwerk-Bücher kostenlos online lesen. Ein Service des Rheinwerk Verlags
					






					openbook.rheinwerk-verlag.de
				




Das solltest Du aber nicht mehr brauchen, wenn Du dann eine generische Liste nutzt, also List<Vokabel> um Vokabeln zu speichern.

Diese Generics sind natürlich auch erklärt:


			Besondere Typen der JavaÂ SE
		


Und der Punkt mit der Objekt-Gleichheit ist auch erklärt:





						Openbooks. Rheinwerk-Bücher kostenlos online lesen. Ein Service des Rheinwerk Verlags
					






					openbook.rheinwerk-verlag.de


----------



## Slaylen (26. Jan 2021)

Vielen Dank ^^


----------

