Projekt Java Anfänger

xBigBoss

Mitglied
Hallo,
ich habe folgendes Problem ich soll als kleines Projekt ein Telefonbuch "programmieren".
Hab nun folgendes Problem und zwar funktioniert es nur 1 mal wollte es mit einer while Schleife so lösen das es mich solange fragt bis ich es beende nur ich bekomme egal welchen Namen ich eingebe immer die gleiche Nummer!


Seht ihr den Fehler? Danke!


Java:
package xxx3;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.util.Scanner;


public class xxx3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	
		int i = 1;////XXXXXXXXXXXXXXxxxx
		
	
		
												
		String x = JOptionPane.showInputDialog(null,"Bitte geben Sie den Vornamen, der von Ihnen gesuchten Person an!",
                         						"Telefonbuch",
                         						JOptionPane.PLAIN_MESSAGE);
										
	
		
		
		while (i==1) ////xxxxxxxxxxxxxxxxxxxxxxxxxxx
		{
			
		if (x.equals ("Niclas"))
		{
		JOptionPane.showMessageDialog(new JFrame(),"Die Telefonnummer lautet: 07633 / 3333");		
		}
			
		else if (x.equals ("Daniel"))
		{
		JOptionPane.showMessageDialog(new JFrame(),"Die Telefonnummer lautet: 07633 / 2222");		
		}
		
		
		else 
		{	
		JOptionPane.showMessageDialog(new JFrame(),"Name im Telefonbuch nicht vorhanden!");	
		
		}
	
		
		
		
		int a = JOptionPane.showConfirmDialog(null,
				"Möchten Sie einen anderen bzw. noch einen Namen suchen?",
				"Telefonbuch",
				JOptionPane.YES_NO_CANCEL_OPTION);

		
		
		if (a==0) 
		
		{
		String b = JOptionPane.showInputDialog("Welche Person möchte Sie suchen?");
		}
			
		else
		{
		a++;
		i = -1; ////XXXXXXXXXXXXXXXXXXXXXXXXx
		}
		
		
		} ///xxxxxxxxxxxxxxxxx
	
		
	
			
			
			
			
		
			
		
	}

}
 
Hallo 🙂

Deine Eingabe wird in Zeile 19 außerhalb der Schleife gelesen, deshalb ist der gesuchte Wert immer der gleiche. Wenn jedesmal nach einem anderen gesucht werden soll, müsstest du die Eingabe auch in der Schleife erledigen 😉
 
Mein Freund rme ist (leider) häufig schneller, aber meinen Senf gebe ich doch noch
Vielleicht auch mal daran denken lesbaren Code zu schreiben
Java:
int i = 1;////XXXXXXXXXXXXXXxxxx
Pfui!
dafür gibt es enums, keine magischen Konstanten
Java:
	enum Modus {
		START, ENDE
	};
public static void main(String[] args) {
	Modus i = Modus.START;
	while (i != Modus.ENDE) {
		//...
	}
	
}
 
Eine Frage habe ich noch: Was soll das hier:
Code:
////XXXXXXXXXXXXXXxxxx
?

Und noch ein paar Tipps:
  1. Klassen sollten immer einen sprechenden Namen haben. xxx3 spricht nicht zu mir 🙂
  2. Die ganzen Leerzeilen machen deinen Code sehr schlecht lesbar. Das jede geschweifte Klammer eine Zeile für sich hat. Ok. Über die Klammern zu ließe sich streiten aber das machen die einen so und die anderen so. Aber das manchmal einfach so mitten im Code Leerzeilen sind ist kein guter Stil 🙂
 
Das Problem ist nun wenn ich die while-Schleife schon in Zeile 19 beginnen lasse ist dann aber das ich zwei mal nach dem Namen der Person gefragt werde, da ich ja einmal am Anfang und dann am Ende, die Frage stelle!
Deswegen dachte ich das ich den ersten Teil nicht in die while-Schleife schreiben soll?!


Die xxx waren für mich nur einen kleine Hilfe! Sorry!
 
Die einfache Lösung ist dann, die Abfrage am Ende zu entfernen - wenn Nein auf die Wiederholungsfrage geklickt wird, verlässt du die Schleife, ansonsten beginnt sie von vorn und stellt die Frage.. n'est-ce pas? 🙂
 
Dann streich doch einfach das zweite Fragen. :joke:

Für die xx musst du dich nicht entschuldigen.

PS: Und rme war schneller *grmbl*
 
Zuletzt bearbeitet:
Ja aber ich muss doch das Programm bzw die Schleife am Ende beenden mit if else wenn ich das dann weg streiche ist es ja eine endlos Schleife wie beende ich es dann? if (Bedingung) i = -1 aber was müsste ich dann in die Bedingung schreiben da ich ja dann NEIN anklicke!
 
Du setzt im else-Teil doch i auf -1 und damit wird die Schleife kein weiteres Mal ausgeführt, da die Erhaltungsbedingung i == 1 lautet. Du brauchst quasi nur noch den else-Teil, musst deine Bedingung also etwas anpassen 🙂
 
Du könntest alles auf Methoden verteilen und deinen Code dadurch besser strukturieren. Oder die Telefonnummern und Namen vom Benutzer eingeben lassen und das Ganze abspeichern und wieder auslesen.
 
Etwas ganz wichtiges noch: Bennene deine Variablen danach, was sie wirklich sind. Son "i" oder "x" sagt genau so viel aus wie als würdest du sie "Baum" nennen 🙂
 
Das mit dem Namen und Telefonnummer einspeichern lassen falls nicht vorhanden finde ich eine sehr gut Idee! Müsste ich mich mal mit beschäftigen ich weis nämlich gerade nicht wie das funktioniert.


Die Variablen werde ich noch umbenennen 🙂
 
Java:
package xxx;


import javax.swing.JOptionPane;
import javax.swing.JTextField;



public class xxxxx {


		
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int i = 0;
		int a = 1;	
		
		while (i==0)
		{
	
												
		String x = JOptionPane.showInputDialog(null,"Bitte geben Sie den Vornamen, der von Ihnen gesuchten Person an!", "Telefonbuch", JOptionPane.QUESTION_MESSAGE);
						
		
		if (x.equals ("Niclas"))
		{
		JOptionPane.showMessageDialog(null,"Die Telefonnummer lautet: 07633 / 3333", "Telefonbuch", JOptionPane.INFORMATION_MESSAGE);		
		}
			
		else if (x.equals ("Daniel"))
		{
		JOptionPane.showMessageDialog(null,"Die Telefonnummer lautet: 07633 / 2222", "Telefonbuch", JOptionPane.INFORMATION_MESSAGE);		
		}
		
		
		else 
		{	
		JOptionPane.showMessageDialog(null,"Name im Telefonbuch nicht vorhanden!", "Telefonbuch" , JOptionPane.WARNING_MESSAGE);	
		
		
		
		Object[] options = {"Neue Nummer suchen", "Neue Nummer einspeichern", "Beenden"};
		
		int b = JOptionPane.showOptionDialog(null,
                 "Sie haben nun die Möglichkeit diese Nummer einzuspeichern oder eine andere zusuchen.",
                 "Alternativen",
                 JOptionPane.DEFAULT_OPTION, 
                 JOptionPane.INFORMATION_MESSAGE, 
                 null, options, options[0]);

		{
		
	
		
		if (b==1)
		
		{
			
		JTextField vorname = new JTextField();
		JTextField telefonnummer = new JTextField();
	    Object[] message = {"Vorname", vorname, "Telefonnummer", telefonnummer};
	        		
	 
	    JOptionPane pane = new JOptionPane( message, JOptionPane.PLAIN_MESSAGE, JOptionPane.OK_CANCEL_OPTION);
	                                                
	    pane.createDialog(null, "Telefonbuch").setVisible(true);
	 
	    System.out.println("Eingabe: " + vorname.getText() + ", " + telefonnummer.getText()); }
		
		
		
		}
		
		
		}
		
		if (a == 2)
		{
		a++;
		i = -1; 
		}	
			
	
		
		} // Ende while-Schleife	
				
		
	}

}




Soweit bin ich nun gekommen! Ich hoffe es ist "sauberer" geschrieben!
Meine zwei Probleme sind nun wenn ich bei dem Fenster wo ich die 3 Optionen hab auf "Beenden" klicke wird es nicht beendet!

Zweites Problem ist die von mir eingespeicherte Nummer kann ich dann im nächsten Schritt nicht mehr aufrufen d.h ich gibt Name und Nummer ein und die wird auch unten in der Konsole gespeichert aber wie ruf ich die dann wieder auf? Wenn ich den Namen den ich eingespeichert hab eingib kommt immer die Meldung "Name nicht vorhanden"!
 
Ich sehe nirgends die Zuweisung an den beenden Button. Nur weil beenden drauf steht muss nicht beenden drin sein.

Dein Code sieht auf jeden Fall besser aus aber die Benennung der Variablen ist noch immer nicht sprechend. Weder xxx, noch a, x oder i spricht mit mir.
 
Okay ich steh gerade ein bisschen auf dem Schlauch, wie kann ich das den Zuweisen?
Ich komm so langsam an die Grenze meiner Kenntnisse -.-



EDIT: Das Problem wäre gelöst 😀 Hab eine Falsche eckige Klammer gesetzt!


Nun gibt es nur noch das Problem mit dem Speichern und anschließend abrufen!
 
Zuletzt bearbeitet:
Für das Speichern empfehle ich dir eine HashMap.

Und du solltest dich dringend mal mit dem Konzept der Methoden beschäftigen.
 
Ich hab den Code jetzt einfach mal mit der Eclipse-Formatier-Funktion verbessert, und das kam dabei raus:
Java:
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Telefonbuch {

	public static void main(String[] args) {

		int i = 0;
		int a = 1;

		while (i == 0) {
			String name = JOptionPane.showInputDialog(
							null,
							"Bitte geben Sie den Vornamen, der von Ihnen gesuchten Person an!",
							"Telefonbuch", JOptionPane.QUESTION_MESSAGE);

			if (name.equals("Niclas")) {
				JOptionPane.showMessageDialog(null,
						"Die Telefonnummer lautet: 07633 / 3333",
						"Telefonbuch", JOptionPane.INFORMATION_MESSAGE);
			}

			else if (name.equals("Daniel")) {
				JOptionPane.showMessageDialog(null,
						"Die Telefonnummer lautet: 07633 / 2222",
						"Telefonbuch", JOptionPane.INFORMATION_MESSAGE);
			}

			else {
				JOptionPane.showMessageDialog(null,
						"Name im Telefonbuch nicht vorhanden!", "Telefonbuch",
						JOptionPane.WARNING_MESSAGE);

				Object[] options = { "Neue Nummer suchen",
						"Neue Nummer einspeichern", "Beenden" };

				int neuerEintrag = JOptionPane
						.showOptionDialog(
								null,
								"Sie haben nun die Möglichkeit diese Nummer einzuspeichern oder eine andere zusuchen.",
								"Alternativen", JOptionPane.DEFAULT_OPTION,
								JOptionPane.INFORMATION_MESSAGE, null, options,
								options[0]);

				if (neuerEintrag == 1) {
					JTextField vorname = new JTextField();
					JTextField telefonnummer = new JTextField();
					Object[] message = { "Vorname", vorname,
							"Telefonnummer", telefonnummer };

					JOptionPane pane = new JOptionPane(message,
							JOptionPane.PLAIN_MESSAGE,
							JOptionPane.OK_CANCEL_OPTION);

					pane.createDialog(null, "Telefonbuch").setVisible(true);

					System.out.println("Eingabe: " + vorname.getText() + ", " + telefonnummer.getText());
				}

			}

			if (a == 2) {
				a++;
				i = -1;
			}
		}
	}

}

Zudem habe ich einige Variablen umbenannt.
 
Für was genau sind
Code:
i
und
Code:
a
?
Die if-Abfrage am Ende der while-Schleife ergibt (im Moment) immer false; a und i werden nie bearbeitet.
 
Das sieht schon eher nach Code aus. Auch wenn die Benennung der Variablen i und a noch immer nicht gut ist.

naja

Java:
if (name.equals("Niclas")) {
                JOptionPane.showMessageDialog(null,
                        "Die Telefonnummer lautet: 07633 / 3333",
                        "Telefonbuch", JOptionPane.INFORMATION_MESSAGE);
            }
 
            else if (name.equals("Daniel")) {
                JOptionPane.showMessageDialog(null,
                        "Die Telefonnummer lautet: 07633 / 2222",
                        "Telefonbuch", JOptionPane.INFORMATION_MESSAGE);
            }
ich sehe da einiges an code verdopplung..
 
Ja. HashMaps <3

Was mir auch noch aufgefallen ist: Du verwendest
Code:
.equals("Name")
.
Code:
.equalsIgnoreCase("Name")
ist besser da es die Groß-und-Kleinschreibung ignoriert.
 
Zuletzt bearbeitet:
Erstmal danke für die ganzen nützlichen Tipps habe das mit .equalsIgnoreCase("Name") übernommen!
Den Code hab ich auch etwas besser gestaltet, ich möchte aber drauf hinweisen das es hier bei diesem Projekt nur eine nebensächliche Rolle spielt, wichtig ist, dass es FUNKTINOIERT!


Von HashMaps hab ich als Java Anfänger leider noch nie etwas gehört, habe es auch mal gegoogelt, es gibt allerdings leider nicht sehr viele Informationen darüber. Könnte mir das vielleicht jemand verständlich erklären?
Oder gibt es eventuell noch eine anderen vielleicht leichtere Lösung des Problems?


_______________________________________________________________________
Nochmal meine Idee für die die etwas später hinzugekommen sind:
Ich möchte eine Telefonbuch erstellen und dort soll man durch eine grafische Oberfläche Name und Nummer einer Person einspeichern können. Im nächsten Schritt werde ich nun aufgefordert den Namen einzugeben und erhalte hierzu die davor eingespeicherte Nummer!
________________________________________________________________________


Frohes Weihnachtsfest!
 
Eine [JAPI]HashMap[/JAPI] ist eine Art ArrayList (wie die unter der Haube funktioniert weiß ich nicht. Bitte kreuzigt mich nicht dafür). Auf ihre Elemente greifst du aber nicht mit einem Index zu sondern mit einem Hash. Da geht laut Oracle Doc alles, was ein [JAPI]Object[/JAPI] ist.

Hier mal ein Beispiel:
Java:
HashMap <String,String> testMap = new HashMap <String,String> ();
test.put("Ich bin der Schlüssel", "Und ich bin das hinter dem Schlüssel");
System.out.println(test.get("Ich bin der Schlüssel") ); //Ausgabe: Und ich bin das hinter dem Schlüssel
 

Zurück
Oben