Generische Liste überschreibt die Daten. Java 

Status
Für weitere Antworten geschlossen.

Geardi123

Stammuser
Registriert
Jan. 2007
Beiträge
606
HI

ich bin wirklich seit 2 Tagen an einem Problem für die Uni.

Ich möchte folgende Aufgabe lösen:

Programmieren Sie die Klasse List aus der Vorlesung.

a) Implementieren sie dabei die folgenden Methoden wie in der Vorlesung beschrieben:

public String toString() {...}
public boolean isEmpty() {...}
public void insertFirst(K elem) {...}


b) Erweitern Sie Ihre Klasse List um die folgenden Methoden:

Abfragen der Anzahl der Elemente in der Liste:

public int size() {...}
Die Methode gibt die Anzahl der in der Liste gespeicherten Objekte zurück.
Abfragen eines Elements an einer bestimmten Position:

public K get(int pos) {...}
Die Methode liefert das Objekt an der Stelle pos zurück. Falls gilt (pos < 0 || pos >= size()) soll ein Objekt der folgenden Runtime-Exception geworfen werden: java.lang.IndexOutOfBoundsException

Hinzufügen eines Elements an einer bestimmten Position:

public void add(K elem) {...}
Die Methode hängt das Objekt elem an die bestehende Liste hinten an. Falls gilt (elem==null) soll ein Objekt der folgenden Runtime-Exception geworfen werden: java.lang.NullPointerException

Testen Sie Ihre neuen Methoden ausführlich in der main-Methode der Klasse Main.

Testen Sie die Klasse List mit der Klasse Account als den Typ-Parameter. Fügen Sie 2 Accounts hinzu und geben die Liste auf der Konsole aus. Prüfen Sie vor und nach dem Hinzufügen der Elemente den Rückgabewert der Methode isEmpty(). Fügen Sie einen weiteren Account mit Hilfe der Methode insertFirst(...) vorne in der Liste ein. Überprüfen Sie die Korrektheit indem Sie die Liste erneut auf der Konsole ausgeben.

c)Ersetzen Sie das Account Array in der Klasse Cashmachine durch Ihre eigene Klasse List. Passen Sie ihre Klasse Cashmachine entsprechend an.

d) Implementieren Sie die Methode java.util.Iterator iterator() {...} unter Verwendung einer geeigneten (inneren) Klasse wie in der Vorlesung besprochen. Testen Sie Ihren Iterator ausführlich!



Ich hände an der add Methode, sie funktioniert einfach nicht ( habe die ganze Klasse schon 2 mal neu geschrieben aber ich komme nicht darauf)

Erstmal die funktionierenden Klassen:


Code:
package A4.bin;

public class Account {

private int accountNumber;
private float overdraft; //Dispokredit des Kontos
private float bankDeposit; //die Höhe des Kontoguthabens
private int pin = 1234;


public Account(int accNumber, float dispo, float guthaben){
accountNumber= accNumber;
overdraft = dispo;
bankDeposit = guthaben;

}


public float getoverdraft(){
return overdraft;

}

public float getbankDeposit(){
return bankDeposit;
}

public int getAccountNumber() {
return accountNumber;
}

public void setAccountNumber(int accountNumber) {
this.accountNumber = accountNumber;
}

public void setOverdraft(float dispo){
this.overdraft = dispo;

}
public void setBankDeposit(float guthaben){
this.bankDeposit = guthaben;

}


public int getPin(){
return pin;
}

@Override
public String toString() {
return ("Accountnummer:" + this.accountNumber + " Guthaben: " + this.bankDeposit + " Dispo:" + this.overdraft);
}



}




Code:
package A4.bin;



public class Main {

public static void main(String[] args) throws NullPointerException {



Account acc1 = new Account(5, 1.22f, 4.55f);
Account acc2 = new Account(9, 7.66f, 9.44f);

try {
List test = new List();
test.insertFirst(acc2);
System.out.println("add aufruf:");
test.add(acc1);
System.out.println(test.isEmpty());
System.out.println("size aufruf:");
System.out.println(test.size());

System.out.println("get(1) aufruf:");
System.out.println(test.get(1));
System.out.println("get(2) aufruf:");
System.out.println(test.get(2));

} catch (NullPointerException exc) {

System.out.println("GROßerfehler");
}

}

}


Und mein Problemfall: ( habe die add auf 2 arten Implementiert und den einen Fall auskommentiert)



Code:
package A4.bin;
import java.lang.*;

import java.util.Collections;
import java.util.Iterator;


public class List implements Iterable {
int size = 0;

private ListNode head;

private class ListNode {
ListNode next;
K data;

void setData(K data) {
this.data = data;
}

ListNode getNext(){
if (next != null){
return next;
}
}
boolean hasNext(){
if (head.next != null){
return true;
}else{
return false;
}
}


void setNext(ListNode next) {
this.next = next;
}

public boolean isEmpty() {
return head == null;
}

public K getData(){
return this.data;

}


}


@Override
public String toString() {
ListNode l = head;
StringBuilder sb = new StringBuilder();
System.out.println("a");
while (l != null) {
sb.append("");
l = l.next;
}
return sb.toString();
}

public void insertFirst(K elem) {
ListNode newHead = new ListNode();
newHead.setData(elem);

newHead.setNext(this.head);

this.head = newHead;

}

public boolean isEmpty() {
return head == null;
}

public int size() {
size = 0;
ListNode tempHead = this.head;
System.out.println("size1");
while (tempHead != null) {
System.out.println("size2");
tempHead = tempHead.next;
size++;
}
return size;

}

public K get(int pos) throws IndexOutOfBoundsException {
System.out.println(head.data);



K x = null;
System.out.println("test1");
ListNode tempHead = this.head;
if (pos > 0 || pos 
System.out.println(tempHead.data);
System.out.println("test2");

for (int i = 0; i < pos; i++) {
System.out.println("test3" + this.head.data);

tempHead = tempHead.next;
System.out.println("test4");

}

} else {
throw new IndexOutOfBoundsException();
}
System.out.println("letztes get");
// System.out.println(tempHead.data);
return tempHead.data;

}


/* public void add(K elem) throws NullPointerException {

ListNode addHead = new ListNode();
addHead.setData(elem);

System.out.println(head.data);
System.out.println(addHead.data);

for(int i =1; i< size(); i++){
head = head.next;
if( head.next == null ){
head.setNext(addHead);


break;
}
}
*/

public void add(K elem) {
ListNode temp = new ListNode();
temp.setData(elem);
ListNode iterating = head;
if (head == null) {
head = temp;
return;
}
for (; iterating.hasNext(); iterating = iterating.getNext())
;
iterating.setNext(temp);


class myIterator implements Iterator {
public ListNode current;

public myIterator() {
current = head;
}

@Override
public boolean hasNext() {
if (current != null) {
return current.hasNext();
}
return false;
}

@Override
public K next() {
ListNode temp = current;
current = current.getNext();
return temp.getData();
}

@Override
public void remove() {
throw new UnsupportedOperationException();
}
}








}
@Override
public Iterator iterator() {
return new myIterator();
}
}



Mit dieser Klasse, die mir ein Kommilitone gegeben hat funktioniert mein Programm super ( bei ihm heißt die ListNode, innerData) wäre echt super wenn mir jemand meinen fehler zeigen könnte. ICh weiß echt nichtmehr weiter :-(



Code:
import java.util.*;

public class List implements Iterable {
innerData head;

public List() {
head = null;
}

public class innerData {
K data;
innerData next;

public innerData(K newData) {
data = newData;
next = null;
}

public void setNext(innerData newNext) {
next = newNext;
}

public innerData getNext() {
if (next != null) {
return next;
}
return null;
}

public boolean hasNext() {
if (next == null) {
return false;
}
return true;
}

public String toString() {
return data.toString() + " " + next.toString();
}

public K getData() {
return data;
}
}

public class myIterator implements Iterator {
public innerData current;

public myIterator() {
current = head;
}

@Override
public boolean hasNext() {
if (current != null) {
return current.hasNext();
}
return false;
}

@Override
public K next() {
innerData temp = current;
current = current.getNext();
return temp.getData();
}

@Override
public void remove() {
throw new UnsupportedOperationException();
}
}

public String toString() {
if (head != null) {
return head.toString();
}
return null;
}

public boolean isEmpty() {
if (head == null) {
return true;
}
return false;
}

public void insertFirst(K newElement) {
innerData temp = new innerData(newElement);
if (head != null) {
temp.setNext(head);
}
head = temp;
}

public int size() {
int dataSize = 0;
innerData iterating = head;
while (iterating != null) {
dataSize++;
iterating = iterating.getNext();
}
return dataSize;
}

public K get(int pos) {
innerData iterating = head;
int i;
for (i = 0; i < pos && iterating != null; i++, iterating = iterating
.getNext())
;
return iterating.getData();
}

public void add(K newElement) {
innerData temp = new innerData(newElement);
innerData iterating = head;
if (head == null) {
head = temp;
return;
}
for (; iterating.hasNext(); iterating = iterating.getNext())
;
iterating.setNext(temp);
}

@Override
public Iterator iterator() {
return new myIterator();
}

}






THX
 
Dein Fehler ist in der Methode hasNext von ListNode. Das Objekt head sollte dich hier nicht interessieren.
 
THX für die Antwort.

du meinst ich soll es so Implementieren?!

Code:
 boolean hasNext(){
ListNode tempHead = head;
if (tempHead.next != null){
return true;
}else{
return false;
}
}


leider muss noch irgendwo ein fehler sein...
 
Zuletzt bearbeitet von einem Moderator:
der Code ist doch äquivalent zu dem vorher. Da darf garkein head stehen... (Warum sollte auch? Das gehört doch zu einem ganz anderen Objekt!)

Code:
 boolean hasNext(){
return next != null;
}

Warum Java es überhaupt zulässt, dass du ohne weiteres auf ein private Element eines anderen Objekts zugreifen kannst, erschließt sich mir nicht vollständig. Aber auch wenn Java es dir erlaubt, tu es nicht. Die isEmpty() Methode macht an dieser Stelle genauso wenig Sinn. (Du erstellst ein Objekt um zu prüfen, ob in einem anderen Objekt eine Variable auf null steht. wtf?)
 
Zuletzt bearbeitet von einem Moderator:
THX

habe es heute noch einmal mit einem Kommilitone besprochen

sie müsste so sein:

Code:
boolean hasNext() {
if (next != null) {
return true;
} else {
return false;
}
}


außerdem haben wir die add geändert:

Code:
 public void add(K elem) {
ListNode temp = new ListNode();
temp.setData(elem);

if (isEmpty()) {
head = temp;
} else {
ListNode iterating = head;
while (iterating.hasNext()) {
iterating = iterating.next;
}
iterating.next = temp;
}


trotzdem THX :D
 
Es sei angemerkt das deine hasNext() dasselbe macht wie die von undeath ;-)
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben Unten