Avatar billede louise&patricia Nybegynder
06. januar 2003 - 18:21 Der er 9 kommentarer og
1 løsning

samligning af ArrayLists

Vi vil gerne samligne to ArrayLists. Men vi har lidt problemer med det. Begge lists indeholder begge en integer og en string på hver plads. Altså en title på en bog (String) samt en pris (double). Hver ArrayList repræsentere en boghandel. Det vi gerne vil finde ud af, er hvor man kan finde den billigste bog. Hvordan får vi objekterne ud af arraylisterne, for så at samligne dem?
Avatar billede quaid Nybegynder
06. januar 2003 - 18:40 #1
Kig i dokumentationen. De er næsten identiske med et Vector, blot uden sync.
Man henter fra dem med .get("index nr")
Se doc på http://java.sun.com/j2se/1.4/docs/api/java/util/ArrayList.html
QD::
Avatar billede louise&patricia Nybegynder
06. januar 2003 - 20:30 #2
Vi har prøvet at lave en metode, der samligner om der er nogle ligheder mellem indholdet i arraylisterne. Men vi kan ikke rigtigt få metoden til at fungere. Kan man gøre det på en anden måde?

void prisForskel(){
    for(int n=0; n <= boghandler1.size()-1; n++){
        for(int i=0; i <= kit.boghandler2.size()-1; i++){
            if (boghandler1.get(n) == kit.boghandler2.get(i))
            System.out.println("juHHHH det virker");   
    }
    }   
    }
Avatar billede carstenknudsen Nybegynder
06. januar 2003 - 21:07 #3
Hvordan ligger jeres String og double i hvert
objekt i ArrayList'erne? Er det en Object[2]
eller har i noget helt andet?
Avatar billede louise&patricia Nybegynder
06. januar 2003 - 21:24 #4
øøøh...

Vi gør det på følgende måde, når vi sætter noget ind i ArrayListerne. Hvis det kan hjælpe dig:

void tilfoejBog(String bogNavn, double bogPris){
        boghandler1.add(new Bog(bogNavn, bogPris));
    }
Avatar billede quaid Nybegynder
06. januar 2003 - 22:36 #5
Det ser ud som om det er et bogobjekt i sætter ind.
Hvis i kører prisForskel() og sammenligner objekterne med equality operatoren, vil den formentlig aldrig returnere truem og lave System.out.println!
Det i tester er om de har samme reference. Det vil de aldrig have.
Tror at i skal bruge .equals(). Den ser ikke på referencerne, men kun om de er ens.
Prøv den istedet
QD::
Avatar billede quaid Nybegynder
06. januar 2003 - 22:45 #6
Prøv:

void prisForskel()
{
    for(int n=0; n <= boghandler1.size()-1; n++)
    {
        for(int i=0; i <= kit.boghandler2.size()-1; i++)
        {
            if (boghandler1.get(n).equals(kit.boghandler2.get(i)))
            System.out.println("juHHHH det virker");   
        }
    }   
}
QD::
Avatar billede louise&patricia Nybegynder
06. januar 2003 - 23:15 #7
Ja, det ser rigtigt nok ud, på den måde du skriver det på. Men vi tror problemet ligger i en af vores for løkker, da vi aldrig kommer frem til System.out.println("juHHHH det virker");
Avatar billede nclarkediku Nybegynder
07. januar 2003 - 00:17 #8
Har i implementeret noget i stil med følgende i jeres Bog klasse.

public boolean equals(Object obj) {
    if ( ( obj instanceof Bog ) && ( ((Bog)obj.bogNavn).equalsIgnoreCase( bogNavn ) ) ) {
        return true;
    }
    else {
        return false;
    }
}

bogNavn gætter jeg på i kalder strengen inde i selve klassen.

Den equals man nedarver fra Object tjekker kun om objekterne er ens ikke om indholdet er det.

Håber det hjælper.
Avatar billede arne_v Ekspert
07. januar 2003 - 18:46 #9
public class Bog {
  private String titel;
  private double pris;
  public Bog(String titel, double pris) {
      this.titel = titel;
      this.pris = pris;
  }
  public String getTitel() {
      return titel;
  }
  public double getPris() {
      return pris;
  }
}

ArrayList boghandler1 = new ArrayList();
ArrayList boghandler2 = new ArrayList();
boghandler1.add(new Bog("A", 100.0);
boghandler1.add(new Bog("B", 200.0);
boghandler2.add(new Bog("B", 220.0);
boghandler2.add(new Bog("C", 300.0);
for(int i = 0; i < boghandler1.size(); i++) {
  Bog bog1 = (Bog)boghandler1.get(i);
  for(int j = 0; j < boghandler2.size(); j++) {
      Bog bog2 = (Bog)boghandler2.get(i);
      if(bog1.getNavn().equals(bog2.getNavn()) {
          if(bog1.getPris() < bog2.getPris()) {
                System.out.println(bog1.getNavn() + " er billigst hos 1");
          } else if(bog1.getPris() > bog2.getPris()) {
                System.out.println(bog1.getNavn() + " er billigst hos 2");
          } else {
                System.out.println(bog1.getNavn() + " koster det samme hos 1 og 2");
          }
      }
  }
}
Avatar billede arne_v Ekspert
07. januar 2003 - 18:54 #10
Et par andre betragtninger:

1)  Hvis I brugte HashMap i.s.f. ArrayList, så kunne I slå
    direkte op på titel i.s.f. at skulle loope gennem
    hele arrayet.

2)  Brug af float og double til beløb kan give nogle ubehagelige
    små-fejl. I kunne f.eks. angive prisen i øre og bruge en
    int for at undgå problemer.

3)  Hvis I skal have rigtigt store datamængder så skal I gemme data
    i en database og bruge JDBC til at hente dem med (og lave disse
    søgninger med SQL).
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