Moin!
Und zwar stehe ich vor der folgenden Situation:
Bei einer Auktion kann ein Kunde x viele Gebote abgeben, wobei die Summe des Gebots höher sein muss als das Gegenwärtige (quasi wie bei Ebay), ansonsten ist das Gebot nicht gültig. Kunden können per Filter von der Auktion ausgechlossen werden.
Ich habe eine HashMap erstellt und muss die Methoden ausimplementieren.
Die Anforderung für die add-Methode lautet:
Falls Gebot und Kunde gültig sind, werden sie gespeichert und true zurückgegeben, sonst false und Kunde wird ignoriert.
Mein Code:
Code:
public boolean add(Customer c, double bidding) {
if (map.containsKey(c) && map.containsValue(bidding)) {
map.put(c, new BiddingList());
filter.accept(c);
return true;
}
return false;
}
Die Objekte werden im JUnit erstellt und überprüft:
Code:
@Test
public void testAdd1() {
biddingCollector.add(c1, 0);
int actual = biddingCollector.getNrOfCustomers();
assertEquals(0, actual);
}
@Test
public void testAdd2() {
biddingCollector.add(c1, 1);
biddingCollector.add(c1, 2);
int actual = biddingCollector.getNrOfCustomers();
assertEquals(1, actual);
undsoweiter..
}
Wenn ich es laufen lasse, wird mir nur der erste Fall grün angezeigt, weil es nicht geaddet wird(?) Fehler lautet expected 1 but was 0, wobei "but was 0" auch auf den folgenden tests angezeigt wird.
actual ist ein false friend, und heißt nicht aktuell ^^ benutze lieber current.
Zu deinen Tests, besser ist nicht die Anzahl zu prüfen, sondern zu prüfen was alles in der Map drin ist.
Die Anforderung der add-Methode hast du ja schon beschrieben. Wenn Kunde UND Gebot gültig sind ....
Das Gebot ist gültig sofern es höher ist als das zuletzt abgegebene oder? -> wo in deinem Code kontrollierst du nun ob das Gebot gültig ist?
Wann ist ein Kunde gültig?
Was außerdem an diesem Code auffällt:
Du überprüfst ob bidding als Value in der Map vorkommt, fügst als Value dann aber eine Objekt von BiddingList hinzu. Welchen Type verwendest du denn nun für Value?
Außerdem erstellst du für den Kunden jedes mal eine neue BiddingList. Ich nehme eigentlich an es sollte die vorhandene ergänzt werden um das neue Gebot oder? filter.accept(c) soll ja anscheinend kontrollieren ob der Kunde überhaupt berechtigt ist zu bieten. Wo wird das Ergebnis verarbeitet? Auch wenn er nicht berechtigt wäre, zur Map wurde der Kunde schon hinzugefügt und true wird ebenfalls zurückgegeben.
Dann muss ich also kontrollieren, ob der Kunde erstmal überhaupt berechtigt ist. Und schauen ob das gebotene Gebot höher ist als das gegenwärtige.
Richtig, es soll um das neue Gebot ergänzt werden. Ich habe noch eine abstracte Klasse mit BiddingCollector:
Code:
public abstract class BiddingCollector {
protected IFilter filter;
public BiddingCollector(IFilter filter) {
super();
this.filter = filter;
}
public abstract int getNrOfCustomers();
public abstract boolean add(Customer c, double bidding);
public abstract double getHighestBidding();
public abstract int getNrOfBiddings(Customer c);
public abstract List<Double> getBiddings(Customer c);
public abstract Customer getHighestBidder();
}
und mit der weiß ich noch nicht so ganz was ich anfangen soll.
Es ist egal ob der Typ schon in der Map ist oder nicht, solange er das höchste Gebot abliefert.
Keine Ahnung was BiddingList ist, hast du ja noch nicht mit uns geteilt^^ deswegen hier einfach eine Map<Customer, Double>. Was die accept(...) Methode macht, ist bisher auch noch nicht bekannt, deswegen habe ich die weggelassen. Wenn du mehr Infos liefert, wird die Lösung auch detaillierter
publicclassBiddingListextendsArrayList<Double>{publicBiddingList(){super();// TODO Auto-generated constructor stub}publicBiddingList(Collection<?extendsDouble> c){super(c);// TODO Auto-generated constructor stub}publicBiddingList(int initialCapacity){super(initialCapacity);// TODO Auto-generated constructor stub}publicdoublemax(){double m =0;for(Double d :this){if(m < d){
m = d;}}return m;}}
publicclassCustomer{privateint id;privateString surname;privateString forename;privateString street;privateString city;privateString zipCode;privateString country;privateint yearOfBirth;privateint degree;publicCustomer(int id,String surname,String forename,String street,String city,String zipCode,String country,int yearOfBirth,int degree){super();this.id = id;this.surname = surname;this.forename = forename;this.street = street;this.city = city;this.zipCode = zipCode;this.country = country;this.yearOfBirth = yearOfBirth;this.degree = degree;}/**
* @return the surname
*/publicStringgetSurname(){return surname;}/**
* @param surname
* the surname to set
*/publicvoidsetSurname(String surname){this.surname = surname;}/**
* @return the forename
*/publicStringgetForename(){return forename;}/**
* @param forename
* the forename to set
*/publicvoidsetForename(String forename){this.forename = forename;}/**
* @return the street
*/publicStringgetStreet(){return street;}/**
* @param street
* the street to set
*/publicvoidsetStreet(String street){this.street = street;}/**
* @return the city
*/publicStringgetCity(){return city;}/**
* @param city
* the city to set
*/publicvoidsetCity(String city){this.city = city;}/**
* @return the zipCode
*/publicStringgetZipCode(){return zipCode;}/**
* @param zipCode
* the zipCode to set
*/publicvoidsetZipCode(String zipCode){this.zipCode = zipCode;}/**
* @return the country
*/publicStringgetCountry(){return country;}/**
* @param country
* the country to set
*/publicvoidsetCountry(String country){this.country = country;}/**
* @return the id
*/publicintgetId(){return id;}/**
* @return the yearOfBirth
*/publicintgetYearOfBirth(){return yearOfBirth;}/**
* @return the degree
*/publicintgetDegree(){return degree;}/**
* @param degree
* the degree to set
*/publicvoidsetDegree(int degree){this.degree = degree;}/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/@Overridepublicbooleanequals(Object obj){if(obj instanceofCustomer){Customer c =(Customer) obj;return c.getId()==this.id;}elsereturnfalse;}/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/@OverridepublicinthashCode(){return(((Integer)this.id).hashCode());}}
BiddingList ist selbst erstellt? Oder vorgegeben? Ich war ja auch mal Fan vom Erben von Collections... aber oftmals brauchst du nicht die ganze Funktionalität.
Java:
publicclassBiddingList{privateList<Double> list;publicBiddingList(){
list =newArrayList<Double>();}publicdoublemax(){double m =0;for(Double d : list){if(m < d){
m = d;}}return m;}}
Wäre deutlich schlanker.
Ich verstehe jetzt vielleicht etwas besser wie deine Methode funktionieren soll.
Jeder Customer soll alle seine Gebote wissen?