Java: ta bort deltagare och registrerade resultat

Permalänk
Medlem

Java: ta bort deltagare och registrerade resultat

Jag har ett relativt simpelt men enträget problem.

Jag har i ett program en metod för att ta bort en redan registrerad deltagare. Jag vill även att deltagarens registrerade resultat i fråga ska försvinna när deltagaren tas bort, men hur?

För att kunna hjälpa kanske man skulle behöva kika lite i olika klasser men såhär har jag försökt:

private void removeParticipant() {
System.out.print("Number: ");
int number = readInt();

for (Participant participant : participantList) {
if (participant.getNumber() == number) {
System.out.println(participant + " removed");
participantList.remove(participant);

for (Particiapnt participant : participantList)
if (participant.getResult() == result) {
resultList.remove(result);

Rubrik /mod
Permalänk
Entusiast

Jag tror du är på rätt väg men det är svårt att säga för koden du postade är inte komplett.

Först en liten sidokommentar: Det är underligt att du tar in number via din readInt() metod, istället för att skicka med den när du kallar metoden. Såhär: removeParticipant(int number){//resten av koden}

Sen har du inga slutklamrar på någon av dina for-loopar, så jag vet inte om den andra är i eller efter den första. Just nu ser den ut att vara inuti. Dessutom loopar du igenom samma lista i båda.
Jag skulle vilja se dina Participant klass. För som jag förstår det är resultatet en del av den, vilket skulle betyda att det också försvinner i första loopen och gör den andra onödig.

Och slutligen, vad är result? Det är aldrig definierat.

Permalänk
Hedersmedlem

@foobaaar: Jag har redigerat rubriken åt dig enligt §3.1 i forumreglerna. Tydliga rubriker är viktiga för att kunna hålla någorlunda organisation i forumet och du kan dessutom få hjälp fortare.

Citat:

§3.1 Trådrubriker ska tydligt visa vad tråden handlar om.

Permalänk
Medlem

@Blargmode:

Här är Participant-klassen:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class Participant {

private String team;
private String firstName;
private String lastName;
private int number;
private static int counter = 100;
private ArrayList<Result> resultList = new ArrayList<Result>();

public Participant(String team, String firstName, String lastName) {
this.team = team;
this.firstName = firstName;
this.lastName = lastName;
this.number = counter;
counter++;
}

public String getTeam() {
return team;

}

public String getFirstName() {
return firstName;

}

public String getLastName() {
return lastName;

}

public int getNumber() {
return number;
}

public String toString() {
return firstName + " " + getLastName() + " from " + getTeam() + " " + getNumber();
}

public void registerResult(Event event, double result) {
Result newResult = new Result(result, event, this);
resultList.add(newResult);

}

public int checkAttempts(String eventName) {
int count = 0;

for (Result result : resultList) {
if (result.getEvent().getEventName().equals(eventName)) {
count++;
}
}
return count;
}

public void printResults() {
ArrayList<String> topResult = new ArrayList<String>();
sortResult();

for (Result result : resultList) {
topResult.add("Results for " + firstName + " " + lastName + " in " + result);
}

for (String str : topResult)
System.out.println(str);
}

private void sortResult() {
Collections.sort(resultList, new Comparator<Result>() {
public int compare(Result r1, Result r2) {
return r1.getEvent().getEventName().compareToIgnoreCase(r2.getEvent().getEventName());
}
});
}

public Result getTopResult(String eventName) {
sortResult();
for (Result result : resultList) {
if (result.getEvent().getEventName().equals(eventName))
return result;
}
return null;
}

}

Permalänk
Medlem

Ett resultat är väl bara tillgängligt från en Participant-instans? Så om den instansen tas bort borde resultaten också försvinna.

Permalänk
Medlem

Result och kopplingar till Participant finns i ganska många klasser. Det är alltså ganska många klasser som behöver anropa varandra (välkommen till DSV förresten ). Här är lite kod från föregående år, hoppas den går att förstå :

I huvudprogrammet:
//Hämtar rätt Participant genom for-loop (return participant med rätt startnummer)
Participant p = getParticipant(startingNo);

//Hämta laget Patricipant är med i
Team t = getTeam(p.getTeamName());

// Ta bort ur lag
t.removeParticipant(p);

// Ta bort deltagares resultat
p.deleteResult();

// Ta bort ur Program
participants.remove(p);

// Kolla om laget är tomt och ev ta bort
if (t.checkTeamMembers())
teams.remove(t);

patricipants och teams är alltså ArrayLists i "huvud"programmet.
Börjar uppifrån: Team-klassens removeParticipant-metod, där teamMembers är Arraylist i Team-klassen:
public void removeParticipant(Participant p) {
teamMembers.remove(p);
}

Participants deleteResult() metod, där results är arraylist (medals kan du strunta i om ni inte har den i år). Metoden anropar alltså deleteResult-metoden i varje Result, och tömmer arraylisten därefter:

public void deleteResult() {
for (Result r : results) {
r.deleteResult();
}
results.clear();
medals.clear();
}

Anropar alltså Results deleteResult:
public void deleteResult() {
event.deleteResult(this);
}

Som anropar event.deleteResult som har Arraylisten results:
public void deleteResult(Result r) {
results.remove(r);
}

Tillbaks till huvudprogrammet så tas Participant bort ur arraylisten med alla deltagare. Därefter kontrolleras laget om det är några medlemmar kvar, och tas bort ur arraylisten om det är tomt.