Java Adressbuch programmieren

1 Antwort

Frage: Wie geht's richtig?

Da hättest du dir den Code auch sparen können, wenn du ihn nicht verbessern willst und gleich eine fertige Lösung willst.

Ich weiß nicht, was dein Problem ist - dein Programm funktioniert erstmal - zumindest das Eingeben und Speichern eines Kontaktes. Du solltest dir aber noch über einige Punkte klar werden und sie gegebenfalls verbessern.

  • Wenn man mehr als einen Kontakt eingibt, dann wird trotzdem nur der letzte Eintrag in die Datei gespeichert.
  • Es ist generell sinnvoller, Ein- und Ausgabe von der Logik zu trennen. Du solltest als in "Entries" nicht nochmal eine Eingabe verlangen.
  • Du schließt nie die geöffneten Instanzen von Scanner --> potentielles Speicherproblem
  • Wenn du mehrere Adressen speichern willst, würde ich dir eine andere Writer-Klasse empfehlen, die gleich "writeLine()" oder "printLine()" implementiert. "System.getProperty("line.seperator")" schreibt bei mir NULL in die Datei.
  • Klassen, die nur aus statischen Methode bestehen, ignorieren die Vorteile der Objektorientierung. Du könntest dir Gedanken über ein verbessertes / anderes Klassendesign machen.

Ich möchte, dass ich mehrere Strings in der Datei stehen habe oder hast du schon mal ein Adressbuch gesehen in das nur ein Name geschrieben werden kann?

Was ist mit Ein-\Ausgabe von der Logik trennen gemeint?

Wie sehe die save()-Methode mit den writeLine() oder printlnLine-Methoden aus?

Was gebe es für Vorteile mit nicht-statischen Methoden?

0
@Adam1985

Nein, das habe ich nicht. Ich wollte dich nur auf einen Fehler in deinem Programm hinweisen.

Ich meinte etwas in der Art:

List<Contact> contacts = new ArrayList<>();
try (PrintWriter writer = new PrintWriter(new FileWriter("adresses.txt", true))){
    for(Contact contact : contacts)     
        writer.println(contact.toString());
}

Wie du siehst, kannst du die nicht-statische Methode "toString()" auf alle Instanzen der Klasse aufrufen und jede Instanz gibt entsprechend ihrer Attribute die Werte aus. Bei statischen Methoden geht das nicht - diese Methoden beziehen sich nicht auf Instanzen von Klassen.

Es gibt verschiedene Muster (Design Patterns), um die Ein-/Ausgabe bzw GUI von Logik und Model zu trennen. Das soll die Wartbarkeit, Erweiterung und die Wiederverwendbarkeit von Code erleichtern. Beispiele sind MVC, MVVM, MVP.

0

Java Serialisierung und Aufrufen von Dateien?

Hey Leute, ich habe einige Fragen zum Speichern von Dateien:

ich habe eine Klasse namens Struktur, die gespeichert werden soll. Code:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
public class Struktur implements Serializable { 
private static final long serialVersionUID = 1L; 
ArrayList<Ebene> list; 
public Struktur(String name, int wert) { 
Ebene e = new Ebene(name, wert); 
list = new ArrayList<>(); list.add(e); 
} 
public Struktur() 
{ list = new ArrayList<Ebene>();
 } 
public void add(String name, int wert) { 
Ebene e = new Ebene(name, wert); list.add(e);
 }


@SuppressWarnings("unchecked")
public void print()
{
    Collections.sort(list);
    for(int i = 0; i&lt;list.size(); i++)
    {   
        System.out.println(list.get(i).getName()+ " "+ list.get(i).getWert());
        
    }
}

public void speichern(String name, int wert) throws IOException
{
    FileOutputStream fos;
    fos = new FileOutputStream("liste.ser");    
    add(name, wert);        
    ObjectOutputStream oos = new ObjectOutputStream(fos);
    oos.writeObject(list);      
    oos.close();
}
public void lesen() throws IOException, ClassNotFoundException
{
    print();
    FileInputStream fis = new FileInputStream("liste.ser");
    ObjectInputStream ois = new ObjectInputStream(fis); 
    ois.close();
}

}


Dies funktioniert auch alles, jedoch kann ich die Daten erst lesen, wenn ich in der main()-Methode die Methode speichern() ausgeführt habe.

public class Ausführen {
	public static void main(String args[]) throws IOException, ClassNotFoundException  
	{
      Struktur s = new Struktur();
		s.speichern("Thomas", 2341);
		s.speichern("Sigfried", 2345);
		s.speichern("Bernd", 123421);
		s.lesen();
}


Wenn ich jedoch diese Methoden, weg lasse und nur lesen() aufrufe, wird mir nichts mehr ausgegeben.

Ich denke es liegt daran, dass ich die readObject()-Methode in lesen() nicht rein geschrieben habe und beim Ausführen immer der Konstruktor eine neue Liste erzeugt und diese dann ausgegeben wird und nicht die Daten, die eigentlich gespeichert wurden.

Kann mir jemand helfen und sagen, wie ich die Methode so ändern muss bzw. wo ich die Methode lesen() schreiben soll, damit ich die Datei auch auslesen kann?

...zur Frage

[JAVA] Auf eine Methode in einer anderen Klasse zugreifen?

import static java.lang.System.out;
import java.util.Scanner;

public class Datentypen {
@SuppressWarnings("unused")
public static void main(String[] args){
    
    Scanner  keyboard = new Scanner(System.in);
    
    out.println("In Java gibt es viele verschiedene Datentypen. Da ich Ihnen die Unübersichtlichkeit sparen möchte,");
    out.println("habe ich dieses Programm geschrieben. Dieses Programm enthält jeweils ein Beispiel zu je einem Datentypen.");
    out.println("Also, worauf warten Sie? Suchen Sie sich einen Datentypen aus!");
    out.println();
    out.println("Boolean        Char");
    out.println("Byte       Short");
    out.println("Int        Long");
    out.println("Float      Double");
    
    String datentypen  = keyboard.next();
            
    switch(datentypen){
    case "Boolean":
        booleantyp();              //Fehler ist hier!
    }
    }


}

Zweite Klasse:

public class DatentypenMethoden {
public static void maint(String[] args){
    
}

public void booleantyp(){
    
}
}

Wie greife ich jetzt von der Klasse Datentypen auf die Methode "booleantyp()"?

...zur Frage

Verbindung von Netzwerken, wer kann mir den Sinn von folgenden Geräten erklären (siehe unten)?

Also ich schreib bald Abitur in meiner Fachrichtung (IT) und weiß die Funktion folgender Geräte noch nicht, das muss ich aber drauf haben:

Repeater, Hub, Switch, Bridge, Netzwerkkarte, Router, Gateway, Proxy

Also was ein Router ist weiß ich das ist wie zu Hause der dich ans Internet verbindet. Ein Switch weiß ich auch was das ist, ein Switch erweitert nur die Ports am Router mehr nicht, zb wenn der Router nur 4 Eingänge für LAN Kabel hat dann kann man sich eine Switch mit 20 Eingängen kaufen und halt mehr Geräte anschließen. Eine netzwerkkarte weiß ich auch was das ist die dient ja zum senden der Netzwerkdaten etc aber was ist der Rest?

Was ist ein repeater? Welchen Zweck hat er? Was ist eine Bridge, Gateway, Hub, USW? Bei mir zu Hause gibt’s keine Bridge, keinen hub, keine Gateway und wir haben dennoch Internet also was ist der Sinn dieser Geräte?

Mit freundlichen Grüßen

...zur Frage

Java Textdatei Hilfe?

Hallo Leute, ich habe diese Aufgabe:

Schreiben Sie ein Programm, das eine Textdatei einliest und den Benutzer nach einem Buchstaben fragt. Geben Sie anschließend aus, wie häufig der eingegebene Buchstabe in der Textdatei vorkommt.

und bin so weit gekommen, das es mir den gesamten text ausspuckt, wie kann ich das umschreiben so wie es in der Aufgabe verlangt wird? hier meine Code:

package Faust;

import java.io.BufferedReader; 

public static void main(String[] args) {

try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) {

String sCurrentLine;

while ((sCurrentLine = br.readLine()) != null) {

System.out.println(sCurrentLine);

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

...zur Frage

Wie sieht die Punktnotation in Java aus oder wie kann ich auf auf andere Klassen zugreifen?

Wie kann ich in der Klasse Telefon die Methoden aus der Klasse Telefonbuch verwenden ? Wenn ich es mit Punktnotation versuche wie z.B.

public void eintrag_hinzufuegen(String name)
{
    Telefonbuch.hinzufuegen(name);
}

, kommt die Fehlermeldung : non static method cannot be referenced from a static context

1)

import java.util.ArrayList;
public class Telefon
{
protected ArrayList <Telefonbuch> telefonbuch;
protected boolean eingeschaltet;
        
        public Telefon()
    {
        // initialise instance variables
        telefonbuch = new ArrayList <Telefonbuch>();
    }
    
    public void anrufen (String name)
    {
    }
    
    public void einschalten()
    {
        eingeschaltet = true;
    }
    
    public void telefonbuch_uebersicht()
    {
        
    }
    
    public void eintrag_hinzufuegen(String name)
    {
    }
    
    public void eintrag_entfernen(String name)
    {
    }
    
    public boolean eintrag_suchen(String name)
    {
    }
}

2)

import java.util.Arrays;

/**
 * Write a description of class Telefonbuch here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Telefonbuch
{
    // instance variables - replace the example below with your own
    private int anzahl_eintrag;
    private int kapazitaet;
    private String[] name_liste;
    protected boolean gefunden;

    /**
     * Constructor for objects of class Telefonbuch
     */
    public Telefonbuch()
    {
        // initialise instance variables
        String [] name_liste = new String[kapazitaet];
        gefunden = false;
    }
    
    public void set_kapazitaet(int x)
    {
        kapazitaet = x;
    }
    
    public void telefonbuch_uebersicht()
    {
        for(int i=0; i < name_liste.length; i++)
        {
        System.out.println(name_liste[i]);
        }
    }
    
    public void hinzufuegen(String name)
    {
        
    }
    
    public void entfernen(String name)
    {
    }
    
    public boolean suchen(String name)
    {
        for(int i=0; i < name_liste.length; i++)
        {
         if(name_liste[i].equals(name))
         {
         gefunden = true;
         }
         else
         {
         //Abbruch
         }
        }
        return gefunden;
    }
}

...zur Frage

Was möchtest Du wissen?