Java List Suchen mit eigenem Generischen Datentyp

Slaylen

Mitglied
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.
 
Zuletzt bearbeitet:
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 🙂
 
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 😉
 
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.
 
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 ^^
 
Also bezüglich Listen und so:

Bezüglich Typen und das casten:

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:

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

Neue Themen


Zurück
Oben