Avatar billede jih Nybegynder
24. september 2009 - 18:11 Der er 10 kommentarer og
1 løsning

Flytte et objekt fra en ArrayList til en anden

Hej,

jeg er lige begyndt på Java og har lidt problemer med at forstå hvordan ArrayLister fungerer.
Jeg har 2 klasser som skal repræsentere en indkøbskurv og et lager.
Jeg har brug for at flytte nogle objekter (varer) fra en ArrayList i indkøbskurven til en ArrayList i lageret. Det skal gøres uden brug af parametre. Jeg har flyttet dem over med parametre på denne måde:

public void laegiKurv(Vare vare, int antal)
{
  int i;
  if (Lager.lager.contains(vare))
  {
    for (i = 0; i < antal; i++)
    {
      if (Lager.lager.contains(vare))
      {
        indhold.add(vare);
        Lager.lager.remove(vare);
      } else {
        return;
      }
    }
  }
}

jeg har prøvet mig frem med denne metode, men det virker ikke helt som det skal. Nu har jeg kun testet den, mens 2 objekter er i den, men den fjerner så kun den ene, og hvis jeg så kører den igen, får jeg en "null" fejl.

public void tomKurv()
{
  int i = 0;
  for (Vare vare : indhold)
  {
    Lager.lager.add(indhold.get(i));
    indhold.remove(i);
    i++;
  }
}

Hvis I ellers har nogle gode råd til hvordan jeg kan forbedre min kode, er de velkomne ;-)

På forhånd tak,

// jih
Avatar billede arne_v Ekspert
24. september 2009 - 18:24 #1
Det er altid problematisk at loebe gennem en list samtidigt med at man fjerner fra den eller indsaetter i den.

Men grundliggende mener jeg at det er en forkert data struktur du bruger. HashMap i.s.f. ArrayList ville goere det meget nemmere at finde en vare.
Avatar billede jih Nybegynder
24. september 2009 - 18:42 #2
nå ja, lidt input om selve projektet:

Jeg er lige begyndt som datamatiker, og da vi i starten kun bruger BlueJ (kun klasser/objekter, intet main) og ikke opgaven er en lille en, så er det vist ligegyldigt hvad for en class man bruger til at holde varerne i? Der vil fx aldrig være over 10 varer ;-)

Vi har fået som opgave at lave det her projekt, og det skal være vha. funktioner som vi har haft om (fx ArrayList) og vha google til ting vi ikke kan regne ud selv. Nu kan jeg ikke finde nogen information om hvordan man flytter objekter over fra en klasse til en anden, så måtte det blive eksperten. :-)

Kunne du måske hjælpe mig lidt på vej vha ArrayList, eller hvis du mener HashMap stadigvæk er bedre til sådan nogle små projekter, kunne du så måske hjælpe mig med at komme igang med det?
Avatar billede arne_v Ekspert
24. september 2009 - 19:02 #3
Jeg proever lige at bixe lidt kode.
Avatar billede arne_v Ekspert
24. september 2009 - 19:18 #4
Noget kode:

import java.util.ArrayList;
import java.util.List;

public class MovingAround {
    private static void move(List<Stuff> biglst, Stuff stf, int n, List<Stuff> newlst) throws Exception {
        for(int i = 0; i < n; i++) {
            int ix = biglst.indexOf(stf);
            if(ix >= 0) {
                newlst.add(biglst.remove(ix));
            } else {
                throw new Exception("Not enough of " + stf.getName());
            }
        }
    }
    public static void main(String[] args) throws Exception {
        List<Stuff> biglst = new ArrayList<Stuff>();
        biglst.add(new Stuff("A"));
        biglst.add(new Stuff("BB"));
        biglst.add(new Stuff("BB"));
        biglst.add(new Stuff("CCC"));
        biglst.add(new Stuff("CCC"));
        biglst.add(new Stuff("CCC"));
        List<Stuff> newlst = new ArrayList<Stuff>();
        move(biglst, new Stuff("CCC"), 2, newlst);
        System.out.println("Big list:");
        for(Stuff stf : biglst) {
            System.out.println(stf);
        }
        System.out.println("New list:");
        for(Stuff stf : newlst) {
            System.out.println(stf);
        }
    }
}

class Stuff {
    private String name;
    public Stuff(String name) {
        super();
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public boolean equals(Object obj) {
        if (getClass() == obj.getClass()) {
            Stuff obj2 = (Stuff)obj;
            return name.equals(obj2.getName());
        } else {
            return false;
        }
    }
    @Override
    public int hashCode() {
        return (name == null) ? 0 : name.hashCode();
    }
    @Override
    public String toString() {
        return "[" + name + "]";
    }
}
Avatar billede arne_v Ekspert
24. september 2009 - 19:28 #5
Og med baade list og map:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MovingAround {
    private static void move(List<Stuff> biglst, Stuff stf, int n, List<Stuff> newlst) throws Exception {
        for(int i = 0; i < n; i++) {
            int ix = biglst.indexOf(stf);
            if(ix >= 0) {
                newlst.add(biglst.remove(ix));
            } else {
                throw new Exception("Not enough of " + stf.getName());
            }
        }
    }
    private static void move(Map<Stuff, Integer> bigmap, Stuff stf, int n, Map<Stuff, Integer> newmap) throws Exception {
        int bign = bigmap.get(stf);
        if(bign >= n) {
            bigmap.put(stf, bign - n);
            if(newmap.containsKey(stf)) {
                newmap.put(stf, newmap.get(stf) + n);
            } else {
                newmap.put(stf, n);
            }
        } else {
            throw new Exception("Not enough of " + stf.getName());
        }
    }
    public static void main(String[] args) throws Exception {
        List<Stuff> biglst = new ArrayList<Stuff>();
        biglst.add(new Stuff("A"));
        biglst.add(new Stuff("BB"));
        biglst.add(new Stuff("BB"));
        biglst.add(new Stuff("CCC"));
        biglst.add(new Stuff("CCC"));
        biglst.add(new Stuff("CCC"));
        List<Stuff> newlst = new ArrayList<Stuff>();
        move(biglst, new Stuff("CCC"), 2, newlst);
        System.out.println("Big list:");
        for(Stuff stf : biglst) {
            System.out.println(stf);
        }
        System.out.println("New list:");
        for(Stuff stf : newlst) {
            System.out.println(stf);
        }
        Map<Stuff,Integer> bigmap = new HashMap<Stuff,Integer>();
        bigmap.put(new Stuff("A"), 1);
        bigmap.put(new Stuff("BB"), 2);
        bigmap.put(new Stuff("CCC"), 3);
        Map<Stuff,Integer> newmap = new HashMap<Stuff,Integer>();
        move(bigmap, new Stuff("CCC"), 2, newmap);
        System.out.println("Big map:");
        for(Map.Entry<Stuff,Integer> e : bigmap.entrySet()) {
            System.out.println(e.getKey() + " : " + e.getValue());
        }
        System.out.println("New map:");
        for(Map.Entry<Stuff,Integer> e : newmap.entrySet()) {
            System.out.println(e.getKey() + " : " + e.getValue());
        }
    }
}

class Stuff {
    private String name;
    public Stuff(String name) {
        super();
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public boolean equals(Object obj) {
        if (getClass() == obj.getClass()) {
            Stuff obj2 = (Stuff)obj;
            return name.equals(obj2.getName());
        } else {
            return false;
        }
    }
    @Override
    public int hashCode() {
        return (name == null) ? 0 : name.hashCode();
    }
    @Override
    public String toString() {
        return "[" + name + "]";
    }
}
Avatar billede jih Nybegynder
24. september 2009 - 21:03 #6
uha, det blev lidt for indviklet for mig.. jeg skal jo kunne forklare koden for læreren, så det skal helst være noget så simpelt som muligt.

Lige for at understrege, så skal jeg ikke bruge nogle parametre for flytte (eller tømme) metoden. Jeg har en tomKurv() som så skal tage en og en af de objekter der er i ArrayListen, adde til Lager.lager ArrayListen og slette fra indhold ArrayListen. Hvis det kan gøres simplere, ville det være meget godt, ellers må jeg i gang med at læse på, hvad det er du faktisk gør, for jeg forstår stort set ingenting af det :-)

Jeg forstår det nok hvis jeg sætter mig ned og læser det godt og grundigt igennem, men vil helst (hvis muligt) få en løsning som jeg kan forstå ved første øjeblik, hvis du forstår :-)
Avatar billede jih Nybegynder
24. september 2009 - 21:24 #7
Jeg har fået løst det vha. en metode du brugte list1.add(list2.remove(n))

public void tomKurv()
{
  int i = 0;

  for (i = 0; i < indhold.size(); i++)
  {
    Lager.lager.add(indhold.remove(i));
    i++;
  }
  Lager.lager.add(indhold.remove(0));
}

Det er lidt upraktisk, men det virker.. hvis der er en ca lige så simpel måde som virker, vil helst bruge den ;-)

Af en eller anden grund mangler den en, når man kører listen igennem, så jeg bliver nødt til at bruge remove(0) til sidst. Er der en måde at undgå det på?
Avatar billede arne_v Ekspert
25. september 2009 - 03:10 #8
Hvordan virker;

public void tomKurv() {
    Lager.lager.addAll(indhold);
    indhold.clear();
}

?
Avatar billede jih Nybegynder
25. september 2009 - 10:12 #9
Som smurt :-)

Smid et svar og du får points. Tak for hjælpen :-)
Avatar billede arne_v Ekspert
25. september 2009 - 14:53 #10
svar
Avatar billede arne_v Ekspert
25. september 2009 - 14:54 #11
Hvis du skal arbejde meget med ArrayList saa proev og brug 10 minutter paa at gennemlaese dokumentationen for alle de metoder som findes.
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