N
Naeva
Gast
Ich sollte im zuge einer Aufgabe mehrere Klassen verändern, zu einem währe die Table.java die ich auch meiner Ansicht nach richtig geändert habe, laut Test file sind noch 2 fehler bei put und get drin die ich aber nicht finde, hier mal das was ich geschrieben habe!
Table.java
Eine dazugehörige ITable.java (wurde nichts verändert)
Dann noch eine Addressbook.java die auch geändert wurde
dann noch eine IAddressbook.java wo nichts geändert wurde
und die Main.java
Table.java
Code:
public class Table implements ITable {
/**
* Dies solle die erstmalige Groesse von data sein!
*/
private static final int DEFAULT_INITIAL_SIZE = 4;
/**
* Fertige Hilfsklasse für einzelne Einträge.
*/
private static class Entry {
private final Object key;
private Object value;
public Entry(Object key, Object value) {
this.key = key;
this.value = value;
}
public Object getKey() {
return key;
}
public Object getValue() {
return value;
}
public Object setValue(Object value) {
Object oldValue = this.value;
this.value = value;
return oldValue;
}
}
private int size=0;
private Entry[] data = new Entry[DEFAULT_INITIAL_SIZE];
/**
* Gibt die Anzahl der gespeicherten Eintragungen zurück.
*
* @return Anzahl der eingetragenen Datensätze.
*/
public int size() {
return size;
}
/**
* Trägt ein Objekt unter einem Suchbegriff ein.
* Wenn der Suchbegriff bereits vorhanden, wird die zugehörige
* Objektreferenz überschrieben und das vorher dort gespeicherte
* Objekt wird zurückgegeben. Wenn bisher unter dem Schlüssel kein
* Objekt gespeichert war, wird <code>null</code> zurückgegeben.
*
* @param key Suchschlüssel.
* @param value Inhaltsobjekt.
* @return vorheriger Eintrag oder <code>null</code>.
* @throws NullPointerException wenn <code>key == null</code>.
*/
public Object put(Object key, Object value) {
if(key==null) throw(new NullPointerException());
int index=getIndex(key);
if (index!=-1) { //Key exists
return data[index].setValue(value);
}
else { //New Entry
if(size>=data.length) { //data full, expand array
Entry[] datatmp=new Entry[size*2];
for(int i=0;i<data.length;i++)
datatmp[i]=data[i];
data=datatmp;
}
data[size]=new Entry(key,value);
size++;
return null;
}
}
/**
* Gibt das unter einem Suchbegriff gespeicherte Objekt zurück.
*
* @param key Suchschlüssel.
* @return gefundenes Objekt oder <code>null</code>.
* @throws NullPointerException wenn <code>key == null</code>.
*/
public Object get(Object key) {
if(key==null) throw(new NullPointerException());
int index=getIndex(key);
if (index==-1) return null;
return data[index].value;
}
/**
* Stellt fest, ob der Suchschlüssel in der Tabelle eingetragen ist.
*
* @param key Suchschlüssel.
* @return <code>true</code> wenn vorhanden.
* @throws NullPointerException wenn <code>key == null</code>.
*/
public boolean containsKey(Object key) {
if(key==null) throw(new NullPointerException());
return (getIndex(key)!=-1);
}
/**
* Entfernt den Eintrag zu dem angegebenen Suchschlüssel.
* Wenn kein Eintrag zu dem Schlüssel gefunden wird, wird
* <code>null</code> zurückgegeben.
*
* @param key Suchschlüssel.
* @return bisher gespeichertes Objekt oder <code>null</code>.
* @throws NullPointerException wenn <code>key == null</code>.
*/
public Object remove(Object key) {
if(key==null) throw(new NullPointerException());
int index=getIndex(key);
if(index!=-1) { //Key exists
Object ret=data[index].value;
data[index]=data[size-1];
size--;
return ret;
}
else { //Key not found
return null;
}
}
/**
* Gibt ein Feld mit allen Suchschlüsseln zurück.
*
* @return Feld aller Schlüssel.
*/
public Object[] keys() {
Object[] ret=new Object[size];
for(int i=0;i<size;i++)
ret[i]=data[i].key;
return ret;
}
private int getIndex(Object key) {
if (key==null) throw(new NullPointerException());
int res=-1;
for(int i=0;i<size;i++)
{
if(data[i].key.equals(key))return i; }
return res;
}
public void debug() {
System.out.println("Debug der Tabelle\nSize: "+size+" Length: "+data.length);
for(int i=0;i<size;i++) {
System.out.println(i+": "+data[i].toString());
System.out.println("\t Key: "+data[i].key+"\t Entry:"+data[i].value);
}
}
}
Eine dazugehörige ITable.java (wurde nichts verändert)
Code:
public interface ITable {
/**
* Gibt die Anzahl der gespeicherten Eintragungen zurück.
*
* @return Anzahl der eingetragenen Datensätze.
*/
public int size();
/**
* Trägt ein Objekt unter einem Suchbegriff ein.
* Wenn der Suchbegriff bereits vorhanden, wird die zugehörige
* Objektreferenz überschrieben und das vorher dort gespeicherte
* Objekt wird zurückgegeben. Wenn bisher unter dem Schlüssel kein
* Objekt gespeichert war, wird <code>null</code> zurückgegeben.
*
* @param key Suchschlüssel.
* @param value Inhaltsobjekt.
* @return vorheriger Eintrag oder <code>null</code>.
* @throws NullPointerException wenn <code>key == null</code>.
*/
public Object put(Object key, Object value);
/**
* Gibt das unter einem Suchbegriff gespeicherte Objekt zurück.
*
* @param key Suchschlüssel.
* @return gefundenes Objekt oder <code>null</code>.
* @throws NullPointerException wenn <code>key == null</code>.
*/
public Object get(Object key);
/**
* Stellt fest, ob der Suchschlüssel in der Tabelle eingetragen ist.
*
* @param key Suchschlüssel.
* @return <code>true</code> wenn vorhanden.
* @throws NullPointerException wenn <code>key == null</code>.
*/
public boolean containsKey(Object key);
/**
* Entfernt den Eintrag zu dem angegebenen Suchschlüssel.
* Wenn kein Eintrag zu dem Schlüssel gefunden wird, wird
* <code>null</code> zurückgegeben.
*
* @param key Suchschlüssel.
* @return bisher gespeichertes Objekt oder <code>null</code>.
* @throws NullPointerException wenn <code>key == null</code>.
*/
public Object remove(Object key);
/**
* Gibt ein Feld mit allen Suchschlüsseln zurück.
*
* @return Feld aller Schlüssel.
*/
public Object[] keys();
}
Dann noch eine Addressbook.java die auch geändert wurde
Code:
package praktikum2.a2;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public final class Addressbook implements IAddressbook {
private ITable addresses = new Table();
/**
* Konstruktor.
* Wenn die Eingabedatei nicht vorhanden ist, wird ein
* leeres Adressbuch angelegt.
*
* @param inFile Name der Eingabedatei.
*/
Addressbook(String inFile) {
restoreData(inFile);
saveOnExit(inFile);
}
/**
* Diese Methode liest, falls vorhanden, anfängliche Daten
* aus der angegebenen Datei.
*
* @param inFile Dateiname.
*/
private void restoreData(String inFile) {
try {
DataInputStream in =
new DataInputStream(
new BufferedInputStream(new FileInputStream(inFile)));
int n = in.readInt();
for (int i = 0; i < n; i++)
addAddress(new Address(in));
in.close();
}
catch (FileNotFoundException ignore) {
// ignored: we start with an empty table
}
catch (IOException fatal) {
fatal.printStackTrace();
System.err.println("\nVermutlich ist file.dat defekt!");
System.err.println("Am besten wird file.dat geloescht.");
System.exit(1);
}
}
/**
* Diese Methode sorgt dafür, dass alle Dateninhalte in der
* angegebenen Datei gespeichert werden.
*
* @param fileName Dateiname.
*/
private void saveOnExit(final String fileName) {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
try {
DataOutputStream out =
new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream(fileName)));
String[] keys = getNicknames();
out.writeInt(keys.length);
for (int i = 0; i < keys.length; i++)
getAddress(keys[i]).save(out);
out.close();
}
catch (IOException fatal) {
fatal.printStackTrace();
}
}
});
}
public void addAddress(IAddress address) {
addresses.put(address.getNickname(),new Address(address.getNickname(),address.getFirstname(),address.getLastname(),address.getMailAddress()));
//addresses.put(nickname, new Address(nickname, firstname, lastname, mailAddress));
/* TODO: richtigen Aufruf einfuegen! */
}
public void addAddress(
String nickname,
String firstname,
String lastname,
String mailAddress) {
addresses.put(nickname, new Address(nickname, firstname, lastname, mailAddress));
}
public boolean contains(String name) {
if(addresses.containsKey((String)name)) return true;
/* TODO: richtigen Aufruf einfuegen! */
return false;
}
public IAddress getAddress(String name) {
Object k = addresses.get(name);
return (IAddress) k;
}
public String[] getNicknames() {
Object[] k = addresses.keys();
String[] s = new String[k.length];
System.arraycopy(k, 0, s, 0, k.length);
return s;
}
public void remove(String name) {
addresses.remove(name);
}
}
dann noch eine IAddressbook.java wo nichts geändert wurde
Code:
public interface IAddressbook {
/**
* Trägt eine neue Adresse in das Adressbuch ein.
* Der Parameter <code>nickname</code> ist der Schlüsselbegriff.
* Wenn der Schlüssel bereits in dem Adressbuch vorhanden ist,
* werden die Inhalte mit den neuen Werten überschrieben.
*
* @param nickname Kurzname.
* @param firstname Vorname.
* @param lastname Familienname.
* @param mailAddress Email-Adresse.
*/
public void addAddress(
String nickname,
String firstname,
String lastname,
String mailAddress);
/**
* Fügt eine Email-Adresse in das Verzeichnis ein.
* Adress-Objekte sind hinsichlich ihrem Kurznamen (nickname)
* eindeutig.
*
* @param address Adressobjekt.
*/
public void addAddress(IAddress address);
/**
* Sucht nach den Adressdaten.
* Wenn nicht gefunden, wird <code>null</code> zurückgegeben.
*
* @param name Kurzname.
* @return Adressobjekt.
*/
public IAddress getAddress(String name);
/**
* Überprüft ob der Kurzname bereits als Suchschlüssel verwendet wurde.
*
* @param name Kurzname
* @return <code>true</code> wenn Kurzname vorhanden ist.
*/
public boolean contains(String name);
/**
* Entfernt Adressdaten aus dem Adressbuch.
* Wenn keine Daten zu <code>name</code> gefunden werden,
* bewirkt der Aufruf nichts.
*
* @param name Kurzname der Adressdaten.
*/
public void remove(String name);
/**
* Erzeugt ein Feld mit allen Kurznamen.
*
* @return Feld der Kurznamen.
*/
public String[] getNicknames();
}
und die Main.java
Code:
final class Main {
private Main() { }
public static void main(String[] args) {
new UserInterface(new Addressbook("file.dat"));
}
}