Forumdelen sponsras av

Java: ta bort deltagare och registrerade resultat

Trädvy Permalänk
Medlem
Registrerad
Jan 2018

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
Trädvy Permalänk
Entusiast
Registrerad
Sep 2011

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.

Trädvy Permalänk
Moderator
Registrerad
Maj 2015

@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.

ASUS Z97-A | Intel Core i7-4790K | Noctua NH-U14S | ASUS GeForce GTX 1070 Dual OC
2x8GB Corsair Vengeance Pro | Samsung 850 EVO 500GB | Cooler Master V750S
Cooler Master CM 690 III | Saitek Eclipse III | ASUS Strix Claw | Samsung S24D590L

Trädvy Permalänk
Medlem
Registrerad
Jan 2018

@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;
}

}

Trädvy Permalänk
Medlem
Plats
Finland
Registrerad
Maj 2004

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

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Feb 2005

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.