Het zoeken in een ArrayList

Status
Niet open voor verdere reacties.

UneXisted

Gebruiker
Lid geworden
16 sep 2008
Berichten
20
Hallo, ik zal als eerst even mijn doel vertellen. Ik heb nu een klasse ledenlijst en een klasse lid. De bedoeling is dat ik een lid kan aanmaken en vervolgens kan toevoegen aan de ledenlijst. Hierbij is het belangrijk dat ik het lid een inschrijfdatum (in vorm van een String) mee geef, omdat ik ook een methode moet maken om alle personen uit te printen die zich in een maand hebben ingeschreven.

Hoe beschrijf je de methode om iedereen uit te printen uit dezelfde maand?

De klasse Lid:

Code:
public class Lid {
  private String naam;
  private int leeftijd;
  private String inschrijfmaand;
  
  public Lid (String naam, int leeftijd, String inschrijfmaand){
      this.naam = naam;
      this.inschrijfmaand = inschrijfmaand;
      this.leeftijd = leeftijd;
    }
  public String maakNieuwLid( String naam, int leeftijd, String inschrijfmaand) {
      this.naam = naam;
      this.inschrijfmaand = inschrijfmaand;
      this.leeftijd = leeftijd;
      return naam + ", " + leeftijd + ", " + inschrijfmaand;
    }
  public void print() {
      System.out.println( "Naam: " + naam );
      System.out.println( "Leeftijd: " + leeftijd);
      System.out.println( "Inschrijfdatum: " + inschrijfmaand);
      System.out.println( "-----------------");
    }
  public void setinschrijfMaand( String inschrijfmaand ) {
      this.inschrijfmaand = inschrijfmaand;
    }
  public String getMaand() {
      return inschrijfmaand;
    }
}

En de klasse Ledenlijst:

Code:
import java.util.*;

public class Ledenlijst {
  private ArrayList<Lid> lijst;
  private Lid lid;
  private Lid inschrijfmaand;
  private String maand;
  
  public Ledenlijst() {
       lijst = new ArrayList<Lid>();
    }
  public void voeglidToe( Lid lid) {
      lijst.add( lid );
    }
  public int getAantalLeden() {
      return lijst.size();
    }
  public void printMaandOverzicht( String maand ) {
      for( inschrijfmaand.getMaand().equalsIgnoreCase(maand : lijst)) {
     //een print methode?
    }
}
}
 
wat uitgevoerd zal moeten worden:

lednlijst doorlopen..en het volgende doen:
Kijken of ze in een bepaalde maand ingeschreven zijn (zou ik een integer voor gebruiken.. maar ok)
Indien het zo is.. deze eruit lichten en dan ergens anders zetten waar jij die wil hebben.

Of bedoel je het anders?
 
wat uitgevoerd zal moeten worden:

lednlijst doorlopen..en het volgende doen:
Kijken of ze in een bepaalde maand ingeschreven zijn (zou ik een integer voor gebruiken.. maar ok)
Indien het zo is.. deze eruit lichten en dan ergens anders zetten waar jij die wil hebben.

Of bedoel je het anders?
Bijna goed, ik zal het even duidelijk uitleggen.

De user kan een methode aanroepen en een maand intikken als een String. Vervolgens wordt in de ArrayList vergeleken of er objecten zijn opgeslagen die als attribuut die maand hebben. Daarna worden alle leden uitgeprint die aan die eisen voldoen, dus die in dezelfde maand zijn ingeschreven. Het zou dan handig zijn als er niet wordt gelet op hoofdletters, maar dat is bijzaak.
 
wat uitgevoerd zal moeten worden:

lednlijst doorlopen..en het volgende doen:
Kijken of ze in een bepaalde maand ingeschreven zijn (zou ik een integer voor gebruiken.. maar ok)
Indien het zo is.. deze eruit lichten en dan ergens anders zetten waar jij die wil hebben.

Of bedoel je het anders?

Ik ben het killermenace eens...
Ik zou de leden met de juiste maand er uitlichten in een nieuwe ledenlijst doen en deze lijst uitprinten.. Maak hiervoor een functie die een ledenlijst kan uitprinten.

Als je (in je volgende opdracht ) alle mensen die ouder zijn X.. moet afdrukken. Zal het het voordeel zien van deze oplossing ;)

for( inschrijfmaand.getMaand().equalsIgnoreCase(maand : lijst)) :evil:
als je dit over een maand terugleest begrijp je er zelf denk ook niet meer van..

gebruik hiervoor een 'nette lus'
for (Lid lid : lijst) {
if (lid......) // doe iets met een lid als aan je eis voldoet...
}
 
Ik heb nu 12 ArrayLists gemaakt, voor elke maand 1.

Nu is mijn vraag, hoe voeg ik iemand toe in de juiste ArrayList? Ik wil een methode met een parameter. Zoiets als dit:

Code:
  public void voeglidToe( Lid lid, String maand) {
      maand.add( lid );
    }

Nu geeft hij echter aan dat hij de methode add niet kan vinden. Ik ken geen andere manier om dit op te lossen. Wie heeft een idee? De maand moet verwijzen naar een van de 12 ArrayLists, wat moet ik dan als parameter gebruiken?

Alvast bedankt. Sorry voor de vragen, maar dit staat niet uitgelegd in het boek, dus dan is het moeilijk om er een antwoord voor te vinden. :confused:
 
Wat je beter kan doen:

In je Class : Ledenlijst :
Code:
import java.util.*;

public class Ledenlijst {
  private ArrayList<Lid> lijst = new ArrayList<Lid>();
  //private Lid lid; [COLOR="Lime"]//Waar is deze volgens jou voor nodig?[/COLOR]
  //private Lid inschrijfmaand;[COLOR="Lime"] // wat doe je met deze?[/COLOR]
  //private String maand;[COLOR="Lime"] //waar wil je deze voor gebruiken?[/COLOR]
  
  public Ledenlijst() {
    }
[COLOR="Red"]  public void voeglidToe( Lid nieuwlid) {
      lijst.add( nieuwlid );
    } //naam van de variabele veranderd omdat je al een lid als private variabele had staan... kan veel verwarring brengen.[/COLOR]
  public int getAantalLeden() {
      return lijst.size();
    }
[COLOR="Red"]  public void printMaandOverzicht( int inschrijfmaand ) {
      for( i = 0; i < lijst.size()-1; i++) {
     //een print methode?
     //Als lid op positie i in de lijst in de maand inschrijfmaand ingeschreven is. Print de informatie voor dit lid.
    }[/COLOR]
}
}

je Class : Lid
Code:
public class Lid {
  private String naam;
  private int leeftijd;
  private int inschrijfmaand;
  
  public Lid (String naam, int leeftijd, int inschrijfmaand){
      this.naam = naam;
      this.inschrijfmaand = inschrijfmaand;
      this.leeftijd = leeftijd;
[COLOR="Red"]    }
 /* public String maakNieuwLid( String naam, int leeftijd, String inschrijfmaand) {
      this.naam = naam;
      this.inschrijfmaand = inschrijfmaand;
      this.leeftijd = leeftijd;
      return naam + ", " + leeftijd + ", " + inschrijfmaand;
    }*/ //overbodige inhoud in de functie Want je maakt een Lid aan via de contructor[/COLOR]

  public void print() {
      System.out.println( "Naam: " + naam );
      System.out.println( "Leeftijd: " + leeftijd);
      System.out.println( "Inschrijfdatum: " + inschrijfmaand);
      System.out.println( "-----------------");
    }
[COLOR="Red"]  /*public void setinschrijfMaand( int inschrijfmaand ) {
      this.inschrijfmaand = inschrijfmaand;
    }*/[/COLOR]
  public int getMaand(){
    return this.inschrijfmaand;
    }
  public String getNaam(){
    return this.naam;
    }
  public int getLeeftijd(){
    return this.leeftijd;
    }
[COLOR="Lime"]  public String getInfo(){
    return "" + naam + "," + leeftijd + "," + inschrijfmaand;
    }[/COLOR]
}

De rode stukken zijn overbodig.
De eerste is dat omdat je alle variabelen al vult via de contructor
De tweede is dat omdat je net als de vorige de inschrijfmaand al geSet hebt via de contructor. Deze zal niet gaan veranderen.

Wat je wel kan doen ipv het eerste stuk is bijvoorbeeld een getInfo()
Dat je daarmee alles returned.

Voor een maand zou ik een integer gebruiken. Met een String is het makkelijker om een fout te maken.. want er moet maar een character fout staan... of een hoofdletter als kleine letter staan en het komt al niet overeen.
Voor de maanden 1 .. 12 gebruiken.
 
Bedankt killermenace! Ik heb nu op mijn manier het probleem opgelost, maar ik ga jouw manier zeker nog proberen als ik tijd heb. Ik zit nu pas op 3 weken les in Java en ik was kennelijk vergeten dat je geen attribuut hoeft te gebruiken als argument voor een methode. Dat geldt alleen voor een constructor. Ik zal mijn oplossing hieronder nog eens laten zien voor de mensen die geïnteresseerd zijn.

De Ledenlijst:
Code:
import java.util.*;

public class Ledenlijst {
  private ArrayList<Lid> lijst;
   
  public Ledenlijst() {
       lijst = new ArrayList<Lid>();
    }
  public void voeglidToe( Lid lid) {
     lijst.add( lid );
    }
  public int getAantalLeden() {
      return lijst.size();
    }
  public void printPerMaand( String inschrijfmaand ) {
    for( Lid lid : lijst ) {
        if( inschrijfmaand.equalsIgnoreCase( lid.getMaand() ) )
        lid.print();
        else
        System.out.println( "Er zijn geen leden gevonden die zich hebben ingeschreven in deze maand" );
    }
}


}

Het Lid:
Code:
public class Lid {
  private String naam;
  private int leeftijd;
  private String inschrijfmaand;
  
  public Lid (String naam, int leeftijd, String inschrijfmaand){
      this.naam = naam;
      this.inschrijfmaand = inschrijfmaand;
      this.leeftijd = leeftijd;
    }
  public void print() {
      System.out.println( "Naam: " + naam );
      System.out.println( "Leeftijd: " + leeftijd);
      System.out.println( "Inschrijfdatum: " + inschrijfmaand);
      System.out.println( "-----------------");
    }
  public String getMaand() {
      return inschrijfmaand;
    }
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan