Avatar billede chr.kj Nybegynder
22. december 2007 - 11:19 Der er 11 kommentarer og
1 løsning

Problem med while løkke.

Jeg har et problem med min while løkke, som jeg ikke helt forstår.

Som jeg har forstået det med disse løkker så gentager de løkken indtil betingelserne ikke længere er opfyldt..Er det ikke korrekt?

Mit problem består af,at jeg gerne vil hente en liste ud med varer der er på lager i x-antal

Koden til at køre min while løkke ser sådan ud:

public KasseInterface hentLager( int value ) {           
            for( KasseInterface elem : varer ) {                         
                while (value >= elem.getLagerAntal() ) {
                    System.out.println( "Fandt følgende varer" + elem );                   
                    return elem;                       
                }                                 
            }
            JOptionPane.showMessageDialog(null, "Ingen varer skal genbestilles." );           
            return null;
        }

Til at kunne indtaste hvad x-antal på lager skal være har jeg i min GUI et felt og en knap:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
// Her indhentes lagerlisten..
       
        try
        {
            GemOgHent get = new GemOgHent();
            lageret = (Lager) get.hent( "lagerliste.dat" );
            jListOversigt.setListData( lageret.getVarer().toArray() );           
           
        }
        catch( Exception error )
        {
            jTextFieldOplysningsFelt.setText( "Listen kunne ikke hentes " + error.toString() );
        }

Vare vare = (Vare) lageret.hentLager( Integer.parseInt( jTextField1.getText() ));

//Her smides data retur og vises i en liste:
jListVisLagerliste.setListData( lageret.getVarer().toArray() );

Hvis jeg har 2 elementer med et lagerantal på f.eks. 2 & 5 og hvis jeg indtaster at 5 som value viser den kun det første element i min system.out.println og i min jList viser den hele listen og ikke kun den varer der er fundet?

Hvorfor løber den ikke hele listen igennem - Skal den ikke det?

På forhånd tak for hjælpen.
Avatar billede mikkelbm Nybegynder
22. december 2007 - 11:23 #1
Løkken bliver jo ikke færdig.

return elem;

Ovenstående stopper jo løkken og returnerer :)
Avatar billede chr.kj Nybegynder
22. december 2007 - 12:11 #2
Ahh.. Det var også det jeg havde på fornemmelsen, men hvordan får jeg den så til at løbe alle elementerne igennem og returneren alle hvor antal er på x-antal eller derunder?

Er det ved at sætte return elem; længeren ned eller hvordan gør jeg det?
Avatar billede mikkelbm Nybegynder
22. december 2007 - 14:01 #3
Det gør du ved at samle dem i en Collection.

Eksempel:

public ArrayList<KasseInterface> hentLager( int value )
{     
    ArrayList<KasseInterface> foundItems = new ArrayList<KasseInterface>();     
    for( KasseInterface elem : varer )
    {                         
        while (value >= elem.getLagerAntal() )
        {
            foundItems.add(elem);
            System.out.println( "Fandt følgende varer" + elem );
                   
        }                                 
    }
       
    return foundItems;
}
Avatar billede chr.kj Nybegynder
22. december 2007 - 14:10 #4
OK. Tak for det.

Lad mig se om jeg forstået det korrekt.

Der oprettes simpelthen en ny ArrayListe hvor de fundne elementer bliver smidt over i. Er det ikke korrekt?

Man er altså nød til at smide elementerne over i en ArrayListe for at få løkken til at køre alle elementerne igennem.. Har jeg forstået det korrekt?
Avatar billede chr.kj Nybegynder
22. december 2007 - 14:22 #5
Øv.. Den laver bare en uendelig løkke på det første element den finder i min liste?
Avatar billede nielle Nybegynder
22. december 2007 - 14:39 #6
Brug en if i stedet for en while:

public ArrayList<KasseInterface> hentLager( int value )
{     
    ArrayList<KasseInterface> foundItems = new ArrayList<KasseInterface>();     
    for( KasseInterface elem : varer )
    {                         
        if (value >= elem.getLagerAntal() )
        {
            foundItems.add(elem);
            System.out.println( "Fandt følgende varer" + elem );
                   
        }                                 
    }
       
    return foundItems;
}
Avatar billede chr.kj Nybegynder
22. december 2007 - 15:03 #7
Ahhh... Det virker nu efter jeg benyttede if :o)

Smid et svar.

Hvis jeg gerne vil have min:

JOptionPane.showMessageDialog(null, "Ingen varer skal genbestilles." );
return null;

Hvor skal den så flettes ind?
Jeg har prøvet med en else efter "return foundItems", men får fejlen else without if.
Avatar billede mikkelbm Nybegynder
22. december 2007 - 15:10 #8
Den skal sættes ind der hvor du modtager din collection:

ArrayList<KasseInterface> foundItems = hentLager(...);
if (foundItems.size() == 0)
  JOptionPane.showMessageDialog(null, "Ingen varer skal genbestilles." );
Avatar billede chr.kj Nybegynder
22. december 2007 - 15:16 #9
OK.. Lækkert... Den havde jeg ikke lige set.

Er det ok hvis I deler pointene??

Takker endnu engang for hjælpen begge to :o)
Avatar billede mikkelbm Nybegynder
22. december 2007 - 15:18 #10
Det er fint! Jeg overså også den uendelige løkke :)
Avatar billede nielle Nybegynder
22. december 2007 - 16:06 #11
Jeg springer nu over på denne her, men ellers tak for tilbudet. :
Avatar billede chr.kj Nybegynder
22. december 2007 - 16:33 #12
Ok. Men du skal i hvertfald have mange tak for hjælpen :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester