Woerterbuch liefert immer "null"

L

Leo

Gast
hey - ich hab mich gestern mal an ein woerterbuch gesetzt nur irgendwie gibt er mir nicht die richigte übersetzung aus…bzw ich glaub das liegt dadran das er die woerter + uebersetzungen nicht richtig in den arrays speichert. er gibt mir nämlich immer "null" aus.

IO. ist eine vorgegebene klasse zum ein- und auslesen von werten

hier der quellcode:
Java:
class Woerterbuch{
	int max;
	String [] begriff = new String[max];
	String [] translation = new String[max];
	
	
	Woerterbuch(int m){
		int max = m;
	}
	
	void einfuegen(String wort,String uebersetzung){
		//einlesen
		for(int a=0;a<begriff.length;a++){
				begriff[a] = wort;
				translation[a] = uebersetzung;
	
		}
		
	}
	
	String getUebersetzung(String sucheUebersetzung){
		for(int a =0;a<begriff.length;a++){
			if(begriff[a] == sucheUebersetzung){
				return translation[a];
			}
		}
		return null;
	}
	
}

public class ue23_aufgabe4 {

	
	public static void main(String[] args) {
                //liest die maximalen erlaubten eintraege ein
		int max = IO.readInt("Maximale Eintraege: ");
		Woerterbuch buch = new Woerterbuch(max);
		
                //anzahl an begriffen die eingelesen werden sollen
		int anzahl = IO.readInt("Anzahl an Begriffen: ");
		while(max<anzahl){
			anzahl = IO.readInt("Anzahl ueberschreitet max Begriffe: ");
		}
		for(int a=0; a<anzahl;a++){
			String wort = IO.readString("Wort eingeben: ");
			String uebersetzung = IO.readString("Uebersetzung eingeben: ");
			buch.einfuegen(wort,uebersetzung);
		}
		while(true){// die schleife ersetze ich spaeter noch
			IO.println("--------------------");
			IO.println("Uebersetzung suchen: ");
			String sucheUebersetzung = IO.readString("Wort eingeben: ");
			IO.println(buch.getUebersetzung(sucheUebersetzung));
		}
		

	}

}

wäre top wenn mir da jemand weiterhelfen könnte
 

XHelp

Top Contributor
Strings vergleicht man nicht mit
Code:
s1==s2
, sondern mit
Code:
s1.equals(s2)
 

chalkbag

Bekanntes Mitglied
Java:
  void einfuegen(String wort,String uebersetzung){
        //einlesen
        for(int a=0;a<begriff.length;a++){
                begriff[a] = wort;
                translation[a] = uebersetzung;
    
        }
        
    }

eher in Richtung



Java:
 for(int a=0;a<begriff.length;a++){
		        	if (begriff[a] == null || begriff[a]==""){
		                begriff[a] = wort;
		                translation[a] = uebersetzung;
		                break;
		        	}
		    
		        }


praktischer wäre eine variable für die aktuelle Position

Hinzufügen wäre damit deutlich einfacher.

Java:
private int arrayPosition = 0;
			  
		        void einfuegen(String wort,String uebersetzung){
		                begriff[arrayPosition] = wort;
		                translation[arrayPosition] = uebersetzung;
		                arrayPosition++
		        }
 

Rouven50

Aktives Mitglied
Danke schonmal:)

hab das jetzt soweit geändert - allerdings spuckt er mir immernoch nur "null" aus

Java:
 void einfuegen(String wort,String uebersetzung){
		 if(arrayPosition < max){
			 begriff[arrayPosition] = wort;
			 translation[arrayPosition] = uebersetzung;
			 arrayPosition++;
		 }
	 }
	
	String getUebersetzung(String sucheUebersetzung){
		for(int a =0;a<arrayPosition;a++){
			if(begriff[a].equals(sucheUebersetzung)){
				return translation[a];
			}
		}
		return null;
	}
 

XHelp

Top Contributor
Dann pack dir fast in jede Zeile Debaugausgaben wie
Java:
String getUebersetzung(String sucheUebersetzung){
  System.out.println("Übersetzung für das Wort |"+sucheUebersetzung+"| wird gesucht");
  for(int a =0;a<arrayPosition;a++){
    System.out.println("Untersuche Position "+a+" mit dem Wort: |"+begriff[a]+"|");
    if(begriff[a].equals(sucheUebersetzung)){
      System.out.println("Begriff gefunden, gebe die Übersetzung zurück: |"+translation[a]+"|");
        return translation[a];
      }
    }
  System.out.println("Nichts gefunden");
  return null;
}

usw. Dann siehst du, wo was nicht stimmt.
 

Andi_CH

Top Contributor
Vermutlich muss es das, weil da ja
Code:
return null;
steht ;-)

Da wir nicht sehen mit welchen Daten du testes können wir deine Frage auch nicht beantworten.
 

chalkbag

Bekanntes Mitglied
Schau dir den Konstruktor an.

Java:
class Woerterbuch{

    String [] begriff;
    String [] translation;
    
    private int arrayPosition = 0;
    
    Woerterbuch(int m){
    	begriff = new String[m];
        translation = new String[m];
    }
    
    void einfuegen(String wort,String uebersetzung){
        if (arrayPosition < begriff.length){
        	begriff[arrayPosition] = wort;
            translation[arrayPosition] = uebersetzung;
            arrayPosition++;
        }
        
    }
    
    String getUebersetzung(String sucheUebersetzung){
        for(int a =0;a<begriff.length;a++){
            if(begriff[a].equals(sucheUebersetzung)){
                return translation[a];
            }
        }
        return null;
    }
    
}

Java:
public static void main(String[] args) {
		Woerterbuch buch = new Woerterbuch(5);
		buch.einfuegen("Eins", "one");
		buch.einfuegen("Zwei", "two");

		System.out.println(buch.getUebersetzung("Eins"));
		System.out.println(buch.getUebersetzung("Zwei"));

	}
 

Rouven50

Aktives Mitglied
aahh super es geht jetzt:) chalkbag kannst du mir vlt noch kurz erklären waurm man das so mit dem konstruktor machen muss - bzw warum es dann klappt und anders nicht? bin noch nicht soo bewandert in der oo-programmierung…

aber allen schonmal nen dickes dankeschön
 

Andi_CH

Top Contributor
So als kleine Verbesserung würde ich noch
Code:
equalsIgnoreCase
vorschlagen und die Übersetzung in umgekehrte Richtung wäre auch ein Möglichkeit.
Ach ja - es gabt noch eine Nullpointerexeption ;-)

Java:
	String getUebersetzung(String sucheUebersetzung) {
		for(int a = 0; a < begriff.length; a++) {
			if((begriff[a] != null) && (begriff[a].equalsIgnoreCase(sucheUebersetzung))) {
				return translation[a];
			}
		}
		for(int a = 0; a < translation.length; a++) {
			if((translation[a] != null) && (translation[a].equalsIgnoreCase(sucheUebersetzung))) {
				return begriff[a];
			}
		}
		return null;
	}
 

chalkbag

Bekanntes Mitglied
In deiner Variante waren zwei Fehler.

Java:
    int max;
    String [] begriff = new String[max];
    String [] translation = new String[max];
    
    
    Woerterbuch(int m){
        int max = m;
    }

1.) legst du im Konstruktor eine 2. Variable max an, welche nur im Konstruktor gültig war. Diese hatte nichts mit der Klassenvariable max zu tun.

2.) Der Datentyp int (nicht zu verwechseln mit Integer) ist niemals null. Wenn du int max; schreibst, hat max den Defaultwert 0. Die Klassenvariablen wurden so mit new String[0] erstellt. Auch wenn max korrekt verwendet worden wäre, hätte es nicht den gewünschten Effekt erzielt. Die Arrays wären vor dem Konstruktoraufruf schon erstellt worden und die Änderung von max hätte keine Änderung gehabt.
 

Rouven50

Aktives Mitglied
achsoo ok ich dachte ich muss int max; vor dem konstruktor nochmal hinschreiben.. also bekommt der konstruktor immer aus der main funktion (hauptprogramm) direkt werte übermittelt und ich brauch die vorher nicht extra nochmal initialisieren - und wenn ich dann damit arbeiten möchte wie in diesem fall muss ich einmal vor dem konstruktor das array inititalisieren und im konstruktor wird dann der wert zugewiesen? ich hoffe du verstehst was ich mein… irgendwie bin ich noch bisschen mit dem konstruktor auf kriegsfuß

so wäre es aber wieder richtig oder? oder sollte man das so nicht machen - also das man vor dem konstruktor die variable initialisiert:
Java:
    int max;
    String [] begriff;
    String [] translation;
    
    
    Woerterbuch(int m){
        max = m;
        begriff = new String[m];
         translation = new String[m]
    }

aber warum kann ich denn dann nicht auch:

Java:
    int max;
    String [] begriff;
    String [] translation;
    
    
    Woerterbuch(int m){
        max = m;
        begriff = new String[max];
         translation = new String[[max]
    }

schreiben, schließlich weise ich ja max = m zu
 
Zuletzt bearbeitet:

chalkbag

Bekanntes Mitglied
Beide Varianten sind korrekt.

Allerdings ist die Variable max unnötig, du brauchst sie schlichtweg nicht.

Dein max kannst du ja vom Array ermitteln mit z.B. begriff.length.
Das Array weiß ja wie groß es ist, so ist es nicht notwendig diesen Wert extra nochmal zu speichern.
 

Crian

Top Contributor
Man sollte auch prüfen, ob beim Einfügen neuer Begriffe die Arrays Überlaufen.

Dann könnte man auf die Idee kommen, eine Miniklasse

Java:
class Entry {
    public String word;
    public String translation;
}

zu verwenden und im Programm nur noch ein Array. (Von mir aus auch in der Klassen Getter und Setter anbieten und die Daten privat halten.)

Und dann könnte man auf die Idee kommen, eine Liste statt des unhandlichen Arrays zu nutzen.


ah - ja stimmt… wofür brauch man denn genau den konstruktor in einer klasse?

Der (ein) Konstruktor wird aufgerufen, wenn du mit [c]new[/c] eine Instanz deiner Klasse erstellst. Dort werden Initialisierungen vorgenommen, wie zum Beispiel für die Arrays oben.
 

Rouven50

Aktives Mitglied
ok danke

ja ich hab das jetzt so gelöst…so dürfte das array auch nicht überlaufen:
Java:
class Woerterbuch {
	String[] begriff;
	String[] translation;
	private int arrayPosition = 0;
	String na = "nicht vorhanden!";

	Woerterbuch(int m) {
		begriff = new String[m];
		translation = new String[m];
	}

	void einfuegen(String wort, String uebersetzung) {
		// ueberschreiben falls vorhanden
		for (int a = 0; a < arrayPosition; a++) {
			if (begriff[a].equals(wort)) {
				translation[a] = uebersetzung;
			}
		}
		// einlesen
		if (arrayPosition < begriff.length) {
			begriff[arrayPosition] = wort;
			translation[arrayPosition] = uebersetzung;
			arrayPosition++;
		}
	}

	String getUebersetzung(String sucheUebersetzung) {
		// auslesen
		for (int a = 0; a < arrayPosition; a++) {
			if (begriff[a] != null && begriff[a].equals(sucheUebersetzung)) {
				return translation[a];
			}
		}
		for (int a = 0; a < arrayPosition; a++) {
			if (translation[a].equals(sucheUebersetzung)) {
				return begriff[a];
			}
		}
		return na;
	}

}

public class ue23_aufgabe4 {

	public static void main(String[] args) {
		int zaehler=0;
		// maximale anzahl an erlaubten eintraegen
		int max = IO.readInt("Maximale Eintraege: ");
		Woerterbuch buch = new Woerterbuch(max);

		IO.println("----------");
		IO.println("Einlesen!");
		char zeichen = 'j';
		while (zeichen == 'j' && zaehler <max) {
			String wort = IO.readString("Deutsches Wort: ");
			String uebersetzung = IO
					.readString("Englische Uebersetzung eingeben: ");
			buch.einfuegen(wort, uebersetzung);
			zeichen = IO.readChar("Weiter? (j/n): ");
			zeichen = ueberpruefen(zeichen);
			zaehler++;
		}
		IO.println("Speicher ist voll!");
		IO.println("--------------------");
		IO.println("Uebersetzung suchen: ");
		zeichen = 'j';
		while (zeichen == 'j') {
			String sucheUebersetzung = IO.readString("Wort suchen: ");
			IO.println("Eingegeben: " + "'" + sucheUebersetzung + "'"
					+ " Uebersetzung: "
					+ buch.getUebersetzung(sucheUebersetzung));
			zeichen = IO.readChar("Weiter? (j/n): ");
			zeichen = ueberpruefen(zeichen);
			IO.println("--------------------");
		}

	}
	
	//ueberprueft auf gueltiges zeichen
	static char ueberpruefen(char zeichen) {
		while (zeichen != 'j' && zeichen != 'n') {
			zeichen = IO.readChar("Ungueltiges Zeichen: Weiter? (j/n): ");
		}
		return zeichen;
	}

}
 

Andi_CH

Top Contributor
Wenn du noch weiter machen magst, könntest du dich damit auseinandersetzen welche Datenstrukturen besser geeignet sind als Arrays - es gibt z.B. solche bei denen man die Grösse nicht festlegen muss. Die vergrössern sich automatisch. (z.B. Vector)

Oder solche (z.B. HashMap) bei denen du ohne durchzusuchen einfach den kay (z.B. das deutsche Wort) eingibts und den value (das wäre dann das englische Wort) erhälst - kann aber so nur in eine Richtung übersetzen....

Wenn du magst und Ideen hast werden schon weitere Hinweise kommen.
 

Crian

Top Contributor
Wenn man noch weiter denkt, braucht man dann zu einem Wort mehrere Übersetzungen. Eine Klasse für die Übersetzungen zu einem Begriff ist - wie oben angedeutet - vermutlich sinnvoll.
 

Rouven50

Aktives Mitglied
wieso muss man denn extra eine neue klasse anlegen wenn man mehrere wörter speichern möchte…bzw mehrere übersetzungen für ein wort? kann man das nicht auch so irgendwie lösen?
 

Andi_CH

Top Contributor
Man könnte wenn man wollte, aber es ist nicht sinnvoll.

Für jede Sprache eine Klasse macht durchaus Sinn - Ich frage das Objekt deutsch nach dem Index von "Eins" (sagen wir mal der ist 42) und kann dann jede beliebige andere Klasse nach dem Wort mit dem Index 42 fragen.
Das ist ein durchaus übliches Verfahren. Klassen brauchst du nur eine, aber mehrere Objekte davon.
Ach ja, die Initialisierung darf dann natürlich nicht mehr in der Klasse selbst geschehen,
 

Rouven50

Aktives Mitglied
so hab es mal um die klasse entry erweitert allerdings spuckt er mir das aus:
Exception in thread "main" java.lang.NullPointerException
at Woerterbuch.einfuegen(ue23_aufgabe4.java:44)
at ue23_aufgabe4.main(ue23_aufgabe4.java:85


hier der code:
Java:
class Entry{
	String begriff;
	String translation;
	
	Entry(String b, String t){
		this.begriff = b;
		this.translation = t;
	}
	
	String getUebersetzung(){
		return this.translation;
	}
	
	String getBegriff(){
		return this.begriff;
	}
	
	void setBegriff(String begriff){
		this.begriff = begriff;
	}
	
	void setUebersetzung(String translation){
		this.translation = translation;
	}
	
}
class Woerterbuch {
	Entry[] eintraege;
	private int arrayPosition = 0;
	String na = "nicht vorhanden!";

	Woerterbuch(int m) {
		this.eintraege = new Entry[m];
	}

	void einfuegen(String wort, String uebersetzung) {
		// ueberschreiben falls vorhanden
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getBegriff().equals(wort)) {
				this.eintraege[a].setUebersetzung(uebersetzung);
			}
		}
		// einlesen
		if (arrayPosition < eintraege.length) {
			this.eintraege[arrayPosition].setBegriff(wort); 
			this.eintraege[arrayPosition].setUebersetzung(uebersetzung);
			arrayPosition++;
		}
	}

	String getUebersetzung(String sucheUebersetzung) {
		// auslesen
		//suchen nach dem deutschen wort bei eingabe des deutschen wortes
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getBegriff() != null && this.eintraege[a].getBegriff().equals(sucheUebersetzung)) {
				return this.eintraege[a].getUebersetzung();
			}
		}
		//suchen nach dem englischen wort bei eingabe des englischen wortes
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getUebersetzung().equals(sucheUebersetzung)) {
				return this.eintraege[a].getBegriff();
			}
		}
		return na;
	}

}

public class ue23_aufgabe4 {

	public static void main(String[] args) {
		int zaehler=0;
		// maximale anzahl an erlaubten eintraegen
		int max = IO.readInt("Maximale Eintraege: ");
		Woerterbuch buch = new Woerterbuch(max);

		IO.println("----------");
		IO.println("Einlesen!");
		char zeichen = 'j';
		while (zeichen == 'j' && zaehler <max) {
			String wort = IO.readString("Deutsches Wort: ");
			String uebersetzung = IO
					.readString("Englische Uebersetzung eingeben: ");
			buch.einfuegen(wort, uebersetzung);
			zeichen = IO.readChar("Weiter? (j/n): ");
			zeichen = ueberpruefen(zeichen);
			zaehler++;
		}
		IO.println("Speicher ist voll!");
		IO.println("--------------------");
		IO.println("Uebersetzung suchen: ");
		zeichen = 'j';
		while (zeichen == 'j') {
			String sucheUebersetzung = IO.readString("Wort suchen: ");
			IO.println("Eingegeben: " + "'" + sucheUebersetzung + "'"
					+ " Uebersetzung: "
					+ buch.getUebersetzung(sucheUebersetzung));
			zeichen = IO.readChar("Weiter? (j/n): ");
			zeichen = ueberpruefen(zeichen);
			IO.println("--------------------");
		}

	}
	
	//ueberprueft auf gueltiges zeichen
	static char ueberpruefen(char zeichen) {
		while (zeichen != 'j' && zeichen != 'n') {
			zeichen = IO.readChar("Ungueltiges Zeichen: Weiter? (j/n): ");
		}
		return zeichen;
	}

}
 
Zuletzt bearbeitet:

Rouven50

Aktives Mitglied
hab den fehler gefunden…
falsche die werte der class entry übergeben …so gehts:
Java:
		// einlesen
		if (arrayPosition < this.eintraege.length) {
			this.eintraege[arrayPosition] = new Entry(wort,uebersetzung);
			arrayPosition++;
		}
 

Crian

Top Contributor
Wenn du Entry so mit Gettern und Settern versiehst, wie du es oben gemacht hast, solltest du die Member dann auch privat deklarieren.

Wenn du mehrere Übersetzungen haben möchtest, brauchst du natürlich statt einem String eine Liste von Strings.
 

Rouven50

Aktives Mitglied
wie mache ich das denn genau? als erstes importier ich : import java.util.ArrayList;
und dann habe ich das gefunden:
List list = new ArrayList(…);

würde man das dann so in der art machen?
Java:
List uebersetzungen = new ArrayList(IO.readString("Bitte Uebersetzung/en eingeben: " ));

und dann übergebe ich der classe woerterbuch keinen string sondern die liste.. richtig?
 

Rouven50

Aktives Mitglied
soo ich hab die datei mal bisschen abgeändert und daraus ein telefonbuch/adressbuch gemacht weil ich das besser erweitern kann und durch probieren die OO-programmierung besser lerne..

ich les jetzt zusätzlich straße ein - nun steh ich vor dem problem wie ich mehrere werte ausgeben kann… also die funktion getUebersetzung bekommt z.B. den namen uebergeben.. dann durchsucht die funktion das array ob der name vorhanden ist..und wenn ja soll die funktion mir die nummer und strasse ausgeben..allerdings kann man ja nur 1 wert per return zurückliefern - ich hab das auch schon mitn array versucht..allerdings glaube ich das man das auch anders lösen kann..

hier mein programm:
Java:
import java.util.ArrayList;

class Entry{
	String name;
	String number;
	String strasse;
	
	Entry(String n, String nu,String s){
		this.name = n;
		this.number = nu;
		this.strasse = s;
	}
	
	String getStrasse(){
		return this.strasse;
	}
	
	String setStrasse(String strasse){
		return this.strasse = strasse;
	}
	
	String getNumber(){
		return this.number;
	}
	
	String getName(){
		return this.name;
	}
	
	void setName(String name){
		this.name = name;
	}
	
	void setNumber(String number){
		this.number = number;
	}
	
}
class Woerterbuch {
	Entry[] eintraege;
	private int arrayPosition = 0;
	String na = "nicht vorhanden!";

	Woerterbuch(int m) {
		this.eintraege = new Entry[m];
	}

	void einfuegen(String name, String number,String strasse) {
		// ueberschreiben falls vorhanden
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getName().equals(name)) {
				this.eintraege[a].setNumber(number);
				this.eintraege[a].setStrasse(strasse);
			}
		}
		// einlesen
		if (arrayPosition < this.eintraege.length) {
			this.eintraege[arrayPosition] = new Entry(name,number,strasse);
			arrayPosition++;
		}
	}

	String getUebersetzung(String suche) {
		// auslesen
		//suchen nach dem Name (bei eingabe des namens)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getName() != null && this.eintraege[a].getName().equals(suche)) {
				return this.eintraege[a].getNumber();
			}
		}
		//suchen nach der numme(bei eingabe der nummer)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getNumber().equals(suche)) {
				return this.eintraege[a].getName();
			}
		}
		//suchen nach der strasse(bei eingabe der strasse)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getStrasse().equals(suche)) {
				return this.eintraege[a].getName();
			}
		}
		return na;
	}

}

public class ue23_aufgabe4 {

	public static void main(String[] args) {
		int zaehler=0;
		// maximale anzahl an erlaubten eintraegen
		int max = IO.readInt("Maximale Eintraege: ");
		Woerterbuch buch = new Woerterbuch(max);
		IO.println("TELEFONBUCH");
		IO.println("----------");
		IO.println("Einlesen!");
		char zeichen = 'j';
		while (zeichen == 'j' && zaehler <max) {
			String name = IO.readString("Name: ");
			String number = IO
					.readString("Telefonnr.: ");
			String strasse = IO.readString("Strasse: ");
			buch.einfuegen(name, number,strasse);
			zeichen = IO.readChar("Weiter? (j/n): ");
			if(zaehler <max){
			zeichen = ueberpruefen(zeichen);
			} else{
				IO.println("Speicher ist voll!");
			}
			zaehler++;
		}
		
		IO.println("--------------------");
		IO.println("Uebersetzung suchen: ");
		zeichen = 'j';
		while (zeichen == 'j') {
			String suche = IO.readString("Name/Nummer/Strasse: ");
			IO.println("Eingegeben: " + "'" + suche + "'"
					+ " Telefonnr.: "
					+ buch.getUebersetzung(suche));
			zeichen = IO.readChar("Weiter? (j/n): ");
			zeichen = ueberpruefen(zeichen);
			IO.println("--------------------");
		}

	}
	
	//ueberprueft auf gueltiges zeichen
	static char ueberpruefen(char zeichen) {
		while (zeichen != 'j' && zeichen != 'n') {
			zeichen = IO.readChar("Ungueltiges Zeichen: Weiter? (j/n): ");
		}
		return zeichen;
	}

}
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Da hast du ein Wörterbuch - Array ist auf keinen Fall optimal, aber das kann, weil es ja eben OO-mässig gekapsel ist, leicht geändert werden - das Umfeld merkt nichts davon, nur die Zugriffsmethoden müssen geändert werden.


Aehm wieso heisst deine Klasse noch "Woerterbuch" und die Methode getUebersetzung ???:L :D
 

Anhänge

  • uebersetzer.zip
    2,6 KB · Aufrufe: 1

Rouven50

Aktives Mitglied
hehe ja muss ich noch ändern… ja das wörterbuch von dir ist ja die perfektion von meinem:D hast du ne idee wie ich das oben genannte problem lösen kann? das ich 2 werte geliefert bekomme wenn er das gesuchte wort gefunden hat….
 

Andi_CH

Top Contributor
So , noch eine leicht verbesserte Variante mit EnumMap statt Vector - du siehst dass der Aufwand minimal ist, denn nur die Klasse Uebersetzer hat geaendert.

Mein Uebersetzer zeigt dir vielleicht noch einige Dinge an die du denken solltest, wobei ich sicher nicht an alles gedacht habe.

Was dein Problem betriffft:
Arrays sind schlecht weil du nicht so genau weiss wie gross du die machen sollst, also setzt dich doch erst einem mit Vector auseinander. Das ist viel einfacher, weil man da keine Grösse angeben soll.
Versuchs mal mit dem Vector - vielleicht bist du schneller als ich mit einem Beispiel :)
 

Anhänge

  • uebersetzerMitEnumMap.zip
    2,6 KB · Aufrufe: 2

Andi_CH

Top Contributor
Java:
package com.javaforum.uebersetzer;

import java.util.Vector;

public class VectorDemo {

	private class Eintrag {
		private String vn;
		private String nn;
		public Eintrag(String vorname, String nachname) {
			vn = vorname;
			nn = nachname;
		}

		public String getVorname() {
			return vn;
		}

		public String getNachname() {
			return nn;
		}

		@Override
		public String toString() {
			return vn + " " + nn;
		}
	}

	private Vector<Eintrag> liste;

	public VectorDemo() {
		liste = new Vector<Eintrag>();
	}

	public void addEntry(String vorname, String nachname) {
		liste.add(new Eintrag(vorname, nachname));
	}

	public Vector<Eintrag> getEintraege(String name) {
		Vector<Eintrag> resultat = new Vector<Eintrag>();
		for(Eintrag e : liste) {
			if (name.equalsIgnoreCase(e.getVorname()) ||
					name.equalsIgnoreCase(e.getNachname()))
			{
				resultat.add(e);
			}
		}
		return resultat;
	}

	public static void print(Vector<Eintrag> v) {
		System.out.println();
		for (Eintrag e : v) {
			System.out.println(e);
		}
		System.out.println();
	}

	public static void main(String[] args) {
		VectorDemo vd = new VectorDemo(); 
		vd.addEntry("Angela", "Merkel");
		vd.addEntry("Guido", "Westerwelle");
		vd.addEntry("Guido", "Graf");
		vd.addEntry("Rudolf", "Merkel");
		vd.addEntry("Otto", "Graf");
		vd.addEntry("Otto", "Waalkes");
		vd.addEntry("Graf", "Otto");

		Vector<Eintrag> res = vd.getEintraege("Angela");
		print(res);
		print(vd.getEintraege("Guido"));
		print(vd.getEintraege("Merkel"));
		print(vd.getEintraege("oTTo"));
	}
}
 

Rouven50

Aktives Mitglied
hey danke fürs beispiel…steig da aber leider nicht durch…bzw wüsste nicht wie ich das auf mein beispiel anwenden muss damit er mir letztendlich 2 werte ausgibt…hab zuvor noch nie mit vectoren gearbeitet
 

Rouven50

Aktives Mitglied
ich hab das jetzt so gelöst…sicherlich nicht schön^^
auf jeden fall gibt er mir jetzt alle werte aus zu einer person.. egal ob ich strasse,nummer oder name eingebe

Java:
import java.util.ArrayList;

class Entry{
	String name;
	String number;
	String strasse;
	
	Entry(String n, String nu,String s){
		this.name = n;
		this.number = nu;
		this.strasse = s;
	}
	
	//ausgeben und einlesen von strasse
	String getStrasse(){
		return this.strasse;
	}
	
	String setStrasse(String strasse){
		return this.strasse = strasse;
	}
	
	//ausgeben und einlesen von name
	String getName(){
		return this.name;
	}
	
	void setName(String name){
		this.name = name;
	}
	
	//ausgeben und einlesen von nummer
	String getNumber(){
		return this.number;
	}
	
	void setNumber(String number){
		this.number = number;
	}
	
}
class Telefonbuch {
	Entry[] eintraege;
	private int arrayPosition = 0;
	String na = "nicht vorhanden!";

	Telefonbuch(int m) {
		this.eintraege = new Entry[m];
	}

	void einfuegen(String name, String number,String strasse) {
		// ueberschreiben falls vorhanden
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getName().equals(name)) {
				this.eintraege[a].setNumber(number);
				this.eintraege[a].setStrasse(strasse);
			}
		}
		// einlesen
		if (arrayPosition < this.eintraege.length) {
			this.eintraege[arrayPosition] = new Entry(name,number,strasse);
			arrayPosition++;
		}
	}

	String getTelefonnummer(String suche) {
		// auslesen
		//suchen nach dem Name (bei eingabe des namens)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getName() != null && this.eintraege[a].getName().equals(suche)) {
				return this.eintraege[a].getNumber();
			}
		}
		//suchen nach der strasse(bei eingabe der strasse)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getStrasse().equals(suche)) {
				return this.eintraege[a].getNumber();
			}
		}
		//suchen nach der numme(bei eingabe der nummer)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getNumber().equals(suche)) {
				return this.eintraege[a].getNumber();
			}
		}
		return na;
	}
	String getStrasse(String suche) {
		// auslesen
		//suchen nach dem Name (bei eingabe des namens)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getName() != null && this.eintraege[a].getName().equals(suche)) {
				return this.eintraege[a].getStrasse();
			}
		}
		//suchen nach der numme(bei eingabe der nummer)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getNumber().equals(suche)) {
				return this.eintraege[a].getStrasse();
			}
		}
		//suchen nach der numme(bei eingabe der nummer)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getStrasse().equals(suche)) {
				return this.eintraege[a].getStrasse();
			}
		}
		return na;
	}
	
	String getName(String suche) {
		// auslesen
		//suchen nach dem Name (bei eingabe des namens)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getName() != null && this.eintraege[a].getName().equals(suche)) {
				return this.eintraege[a].getName();
			}
		}
		//suchen nach der numme(bei eingabe der nummer)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getNumber().equals(suche)) {
				return this.eintraege[a].getName();
			}
		}
		//suchen nach der numme(bei eingabe der nummer)
		for (int a = 0; a < arrayPosition; a++) {
			if (this.eintraege[a].getStrasse().equals(suche)) {
				return this.eintraege[a].getName();
			}
		}
		return na;
	}
	

}



//Hauptprogramm


public class ue23_aufgabe4 {

	public static void main(String[] args) {
		int zaehler=0;
		// maximale anzahl an erlaubten eintraegen
		int max = IO.readInt("Maximale Eintraege: ");
		Telefonbuch buch = new Telefonbuch(max);
		IO.println("TELEFONBUCH");
		IO.println("----------");
		IO.println("Einlesen!");
		char zeichen = 'j';
		while (zeichen == 'j' && zaehler <max) {
			String name = IO.readString("Name: ");
			String number = IO
					.readString("Telefonnr.: ");
			String strasse = IO.readString("Strasse: ");
			buch.einfuegen(name, number,strasse);
			zeichen = IO.readChar("Weiter? (j/n): ");
			if(zaehler <max){
			zeichen = ueberpruefen(zeichen);
			} else{
				IO.println("Speicher ist voll!");
			}
			zaehler++;
		}
		
		IO.println("--------------------");
		IO.println("Uebersetzung suchen: ");
		zeichen = 'j';
		while (zeichen == 'j') {
			String suche = IO.readString("Name/Nummer/Strasse: ");
			IO.println("Eingegeben: " + "'" + suche + "'");
			IO.println("Name: " + buch.getName(suche) + " Telefonnr.: "
					+ buch.getTelefonnummer(suche) + " Strasse: " + buch.getStrasse(suche));
			zeichen = IO.readChar("Weiter? (j/n): ");
			zeichen = ueberpruefen(zeichen);
			IO.println("--------------------");
		}

	}
	
	//ueberprueft auf gueltiges zeichen
	static char ueberpruefen(char zeichen) {
		while (zeichen != 'j' && zeichen != 'n') {
			zeichen = IO.readChar("Ungueltiges Zeichen: Weiter? (j/n): ");
		}
		return zeichen;
	}

}
 

chalkbag

Bekanntes Mitglied
Klassenvariablen müssen / sollten unbedingt private sein, ansonsten wären setter / getter nicht notwendig, was sie aber sein sollten.
 

Andi_CH

Top Contributor
hey danke fürs beispiel…steig da aber leider nicht durch…bzw wüsste nicht wie ich das auf mein beispiel anwenden muss damit er mir letztendlich 2 werte ausgibt…hab zuvor noch nie mit vectoren gearbeitet

Du wolltest doch was lernen? Das kann man nur, wen man Dinge macht, die man zuvor noch nie gemacht hat und genau darum habe ich dir das Beispiel ja geschrieben!

Du kannst bei den bestehenden Deklarationen unmöglich zwei Werte zurückgeben - wenn da steht
Code:
public int blabla()
dann kann blabla genau einen int zurückgeben - nicht mehr
Sollte da aber
Code:
public Vector<Integer> blabla()
stehen, kannst du beliebig viele int zurückgeben.

Vectoren sind zwar auch nicht mehr das neueste, aber IMO besser als Arrays :) und ausserdem wolltest du doch etwas vernünftiges lernen - also knie dich rein.

Die einzige, allerdings eher doofe, Altenative ist die zu zählen wieviel Wert du zurückgeben willst, dann einen Array der entsprechenden Grösse zu definieren, dann die Werte zuzuweisen und den zurückzugeben.
Genau so wie ich es mit dem Vector mache, mich aber nicht um die Grösse kümmern muss.

Ach ja noch etwas - durchsteigen bringt nichts - verstehen muss du mein Beispiel ;-)
 

Rouven50

Aktives Mitglied
ja da hast du recht - ich pass dein beispiel gleich mal stück für stück an meins an und dann seh ich ja wie sich die werte bzw der rest verändert:) ich poste gleich mal was bei rumgekommen ist;)
 

Rouven50

Aktives Mitglied
wie würde ich das
Java:
    public Vector<Eintrag> getEintraege(String name) {
        Vector<Eintrag> resultat = new Vector<Eintrag>();
        for(Eintrag e : liste) {
            if (name.equalsIgnoreCase(e.getVorname()) ||
                    name.equalsIgnoreCase(e.getNachname()))
            {
                resultat.add(e);
            }
        }
        return resultat;
    }
mit der anderen for schleife schreiben? bin egrade am rumprobieren aber finde keinen wert mit dem er vergleichen kann…würde das gerne mit der anderen for schleife schreiben da die mir "besser" liegt bzw ich einfacher finde weil ich die öfter benutzt habe.. nur ich weiß nicht mit welchem wert er vergleichen muss bei vectoren for(int a=0;a<Entrag;a++) geht zb nicht
 

Rouven50

Aktives Mitglied
soo habs jetzt angepasst und auch verstanden:) nur das mit der forschleife noch nicht…also wie ich das mit der anderen schreibweise hinschreibe

hier mei code(muss noch überschreiben usw einfügen):
Java:
import java.util.Vector;

class Telefonbuch {
	private Vector<Entry> liste;
	//String na = "nicht vorhanden!";

	Telefonbuch() {
		liste = new Vector<Entry>();
	}

	void einfuegen(String name, String number,String strasse) {
		liste.add(new Entry(name,number,strasse));
	}
	
	// auslesen

	public Vector<Entry> getDaten(String suche) {
		Vector<Entry> ausgabe = new Vector<Entry>();
        for(Entry e : liste) {
            if (suche.equalsIgnoreCase(e.getStrasse()) || suche.equalsIgnoreCase(e.getName())
            		|| suche.equalsIgnoreCase(e.getNumber())) {
                ausgabe.add(e);
            }
        }
		return ausgabe;
	}
	
	//ausgabe
    public void print(Vector<Entry> v) {
        System.out.println();
        for (Entry e : v) {
            System.out.println(e);
        }
        System.out.println();
    }
	

}

class Entry {
	private String name;
	private String number;
	private String strasse;
	
	Entry(String n, String nu,String s){
		name = n;
		number = nu;
		strasse = s;
	}
	
	//ausgeben von strasse
	public String getStrasse(){
		return strasse;
	}
	
	//ausgeben  von name
	public String getName(){
		return name;
	}
	
	//ausgeben von nummer
	public String getNumber(){
		return number;
	}
	
    public String toString() {
        return "Name: " + name + "Nummer: " + number+ "Strasse: " + strasse;
    }
	
}


//Hauptprogramm

public class TBuch_Programm {

	public static void main(String[] args) {
		int zaehler=0;
		// maximale anzahl an erlaubten eintraegen
		int max = IO.readInt("Maximale Eintraege: ");
		Telefonbuch buch = new Telefonbuch();
		IO.println("TELEFONBUCH");
		IO.println("----------");
		IO.println("Einlesen!");
		char zeichen = 'j';
		while (zeichen == 'j' && zaehler <max) {
			String name = IO.readString("Name: ");
			String number = IO
					.readString("Telefonnr.: ");
			String strasse = IO.readString("Strasse: ");
			buch.einfuegen(name, number,strasse);
			zeichen = IO.readChar("Weiter? (j/n): ");
			zaehler++;
			if(zaehler <max && zeichen =='j'){
			zeichen = ueberpruefen(zeichen);
			} else{
				if(zeichen != 'n'){
				IO.println("Speicher ist voll!");
				}
			}
			
			
		}
		
		IO.println("--------------------");
		IO.println("Uebersetzung suchen: ");
		zeichen = 'j';
		while (zeichen == 'j') {
			String suche = IO.readString("Name/Nummer/Strasse: ");
			IO.println("Eingegeben: " + "'" + suche + "'");
			IO.println("Datensatz: " + buch.getDaten(suche));
			zeichen = IO.readChar("Weiter? (j/n): ");
			zeichen = ueberpruefen(zeichen);
			IO.println("--------------------");
		}

	}
	
	//ueberprueft auf gueltiges zeichen
	static char ueberpruefen(char zeichen) {
		while (zeichen != 'j' && zeichen != 'n') {
			zeichen = IO.readChar("Ungueltiges Zeichen: Weiter? (j/n): ");
		}
		return zeichen;
	}

}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Rekursive Methode liefert augenscheinlich keinen boolean-Wert zurück. Java Basics - Anfänger-Themen 4
JavaClap "Bruchrechner" liefert Fehler/keine Ausgabe bei Addition und Subtraktion Java Basics - Anfänger-Themen 0
B MySQL (jdbc) -> connection liefert NULL Java Basics - Anfänger-Themen 3
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
M Methoden while liefert nur den ersten Datensatz Java Basics - Anfänger-Themen 12
G Methode liefert "Min@15db9742" als Ausgabe Java Basics - Anfänger-Themen 2
Joker4632 Klassen BigDecimal Multiplikation liefert nicht erwarteten Wert Java Basics - Anfänger-Themen 6
J Kosinussatz liefert falschs Ergebnis Java Basics - Anfänger-Themen 2
J Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
E Methoden Methode liefert keinen Wert zurück Java Basics - Anfänger-Themen 16
Anfänger2011 file.isDirectory() liefert falschen Wert!? Java Basics - Anfänger-Themen 1
B Rechnung ohne Klammer liefert komisches Ergebniss Java Basics - Anfänger-Themen 3
D Operatoren IF Abfrage liefert falsches Ergebnis Java Basics - Anfänger-Themen 4
U ArrayList.get() liefert falsches Ergebnis Java Basics - Anfänger-Themen 4
L replaceAlll liefert Exception... Java Basics - Anfänger-Themen 3
M System.getProperty("java.vm.version") liefert build-Version Java Basics - Anfänger-Themen 4
R Hashset.add(Array) liefert immer true? Java Basics - Anfänger-Themen 23
F charAt-Methode liefert falsche Unicode-Werte Java Basics - Anfänger-Themen 8
P Map liefert bei put null als Ergebnis Java Basics - Anfänger-Themen 6
A contains bzw. indexOf liefert keine Treffer? Java Basics - Anfänger-Themen 3
M Problem mit getter, liefert nur alte Werte Java Basics - Anfänger-Themen 6
F arraylist.get() liefert Speicheradresse?!? Java Basics - Anfänger-Themen 2
R If-Abfrage liefert false zurück, wieso ? Java Basics - Anfänger-Themen 20
R warum liefert ein und dieselbe funktion nicht dasselbe return?? Java Basics - Anfänger-Themen 7
3 Collections containsKey() liefert false obwohl equals() true liefert Java Basics - Anfänger-Themen 6
M isHidden() von java.io.File liefert immer true in Windows Java Basics - Anfänger-Themen 3
B SQL Recortset liefert nur eine Zeile Java Basics - Anfänger-Themen 4
Raidri Pattern liefert false Java Basics - Anfänger-Themen 9
J Datentypen Textfield.getText() liefert keinen String Java Basics - Anfänger-Themen 4
C warum liefert equals kein TRUE Java Basics - Anfänger-Themen 12
Y System.console() liefert immer null zurück. Java Basics - Anfänger-Themen 6
X Datentypen Vergleichsmethode liefert immer null Java Basics - Anfänger-Themen 3
J Batch Datei liefert CLASS NOT FOUND Warum !? Java Basics - Anfänger-Themen 11
O Runden - x/100 liefert long zurück Java Basics - Anfänger-Themen 7
L Enumeration paramNames liefert Werte durcheinander Java Basics - Anfänger-Themen 13
S atan liefert falsches Ergebnis Java Basics - Anfänger-Themen 6
A JavaMail liefert Datenmüll Java Basics - Anfänger-Themen 5
C HashMap liefert HashMap zurück - incompatible types Java Basics - Anfänger-Themen 2
G static array liefert falsche Werte zurück Java Basics - Anfänger-Themen 2
H GPS über ser. Schnittst. liefert teilweise Sonderzeichen Java Basics - Anfänger-Themen 3
G Parser liefert StackOverflow error Java Basics - Anfänger-Themen 6
G Einfache Berechnung liefert falsches Ergebnis Java Basics - Anfänger-Themen 2
H -Djava.library.path liefert in der Konsole "ClassNotFou Java Basics - Anfänger-Themen 4
Z DB-Abfrage liefert alte Werte Java Basics - Anfänger-Themen 11
M Mouse Listener liefert das ergebnis 2 mal! Java Basics - Anfänger-Themen 2
B equals() der Klasse Objects liefert unerwartetes Ergebnis Java Basics - Anfänger-Themen 17
P JPanel.getWidth() liefert immer 0 Java Basics - Anfänger-Themen 6
S DAY_OF_WEEK liefert immer gleichen Wert Java Basics - Anfänger-Themen 6
krgewb Immer dieselbe Zufallszahl Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
F Warum muss ich ein SSL cert immer manuell hinzufügen? Java Basics - Anfänger-Themen 46
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
K Warum werden immer noch doppelte Zahlen ausgegeben ? Java Basics - Anfänger-Themen 13
J Componente immer in Front halten, wie? Java Basics - Anfänger-Themen 5
berserkerdq2 Brauche ich while != -1, wenn ich immer einen BufferedReader verwende? Java Basics - Anfänger-Themen 8
berserkerdq2 Habe ein Spiel entwickelt, dass immer in der 4 Runde einen cast-Fehler erhält Java Basics - Anfänger-Themen 3
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
D Codeblöcke, die immer wieder im Programmverlauf benötigt werden Java Basics - Anfänger-Themen 5
chocobear26 Interface JOptionPane - Dialog_Fenster zeigt immer vorherige Eingabe an. Java Basics - Anfänger-Themen 4
C Objekt1.equals(Objekt2) = immer false. Wieso? Java Basics - Anfänger-Themen 22
I Array übernimmt immer den letzten Input. Java Basics - Anfänger-Themen 14
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
M Untersuchen ob ein Graph nach entfernen einer Kante immer noch zusammenhängend ist Java Basics - Anfänger-Themen 70
J Zweck von Interfaces immer noch nicht klar Java Basics - Anfänger-Themen 3
M Array immer wieder um ein Element erweitern Java Basics - Anfänger-Themen 6
CptK Methoden Event bei gedrückter Maustaste immer wieder ausführen Java Basics - Anfänger-Themen 1
CptK Klassen Event bei gedrückter Maus immer wieder mit Pause ausführen Java Basics - Anfänger-Themen 2
IMain23 2d Array variabler Spaltenwert, Spaltenwert immer um eins erhöhen Java Basics - Anfänger-Themen 3
M JTextField blitzt immer wieder nur auf Java Basics - Anfänger-Themen 12
N Arbeitsspeicher nach kompilieren immer voller Java Basics - Anfänger-Themen 6
S Immer das selbe mit den Schleifen Java Basics - Anfänger-Themen 24
H OOP eine Zahl immer weiter durch 2 teilen Java Basics - Anfänger-Themen 15
B Operatoren Java berechnet immer 0? Java Basics - Anfänger-Themen 3
J Timer bauen, Main Methode immer wieder neu starten Java Basics - Anfänger-Themen 13
N Funktion funktioniert nicht immer Java Basics - Anfänger-Themen 6
I Methoden Schleife immer wieder durchlaufen lassen Java Basics - Anfänger-Themen 15
3 JFrame immer im Hintergrund Java Basics - Anfänger-Themen 1
F Immer wieder gleiche Zufallszahl? Java Basics - Anfänger-Themen 4
J Operatoren Random wird nur einmal erstellt und dann immer verwendet Java Basics - Anfänger-Themen 2
S Repaint() in der Schleife funktioniert nicht immer Java Basics - Anfänger-Themen 5
S Variable in JTextField soll immer um 5 zunehmen Java Basics - Anfänger-Themen 8
schoenosrockos JButton füllt immer das ganze frame Java Basics - Anfänger-Themen 1
N JList + DefaultListModel + JScrollPane --> ensureIndexIsVisible funktioniert nicht immer Java Basics - Anfänger-Themen 1
N Immer Aktiv sein. Java Basics - Anfänger-Themen 8
D Array wird immer mir 100 für jeden Wert initialisiert? Java Basics - Anfänger-Themen 2
J Ergebnis immer 0 Java Basics - Anfänger-Themen 8
S If-Anweisunng ist IMMER true Java Basics - Anfänger-Themen 2
F Inhalt einer Variable auswerten, die sich immer wieder ändert Java Basics - Anfänger-Themen 1
S UserPref und Java Application klappt immer nicht. Java Basics - Anfänger-Themen 2
Ponychan95 Erste Schritte Switch fällt immer bis zum default durch Java Basics - Anfänger-Themen 4
F String immer weiter nach Bedarf vergrößern Java Basics - Anfänger-Themen 3
X Muss man das immer so schreiben o.O Java Basics - Anfänger-Themen 3
F Timer beendet nicht immer Java Basics - Anfänger-Themen 2
N Boolean Werte - immer "false" Java Basics - Anfänger-Themen 5
P JavaFX Textfelder geben immer null zurück Java Basics - Anfänger-Themen 8
M zufälliges Setzen von Schiffen in while klappt nicht immer Java Basics - Anfänger-Themen 3
S Random IDs immer 10-stellig? Wie? Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben