Avatar billede m_els Nybegynder
12. juli 2004 - 23:52 Der er 18 kommentarer og
1 løsning

Hente hashmap i arraylist

Mit program indeholder to klasser gui og data.
I data klassen, ligger der en metode, som henter noget info fra en database. Denne info kommer jeg ind i et hashmap og hashmapet kommer jeg ind i en arraylist. Arraylisten bliver til sidst returneret.

Mit spørgsmål lyder: Hvordan får jeg fat i hashmapet, som ligger i arraylisten?

Kan man overhovedet det, eller skal jeg have fat i en anden løsning?
Avatar billede simonvalter Praktikant
13. juli 2004 - 00:24 #1
Det kan du godt.. men hvis der kun er et map giver ikke rigtigt mening 
når du skal have fat i dit HashMap skal du bare cast det til et HashMap igen når det skal ud af listen

map = (HashMap) list.get(0);
eller med en iterator
map = (HashMap) i.next();

Men hvis der kun er tale om et HashMap hvorfor så ikke retunerer det direkte istedet for at komme det i en arraylist.
Avatar billede m_els Nybegynder
13. juli 2004 - 00:36 #2
public ArrayList getAllPersons(){
    ArrayList array = new ArrayList();
    HashMap hm = new HashMap();
    try {
      stat = conn.createStatement();
      ResultSet rs = stat.executeQuery("SELECT * FROM Personinfo");
      while(rs.next()){
        hm.put("Name",rs.getString("Name"));
        hm.put("Surname",rs.getString("Surname"));
        hm.put("CPR",rs.getString("CPR"));
        hm.put("Areacode",rs.getString("Areacode"));
        hm.put("Street",rs.getString("Street"));
        hm.put("City",rs.getString("City"));
        hm.put("Tlf",rs.getString("Tlf"));
        hm.put("Mobile",rs.getString("Mobile"));
        hm.put("Nationality",rs.getString("Nationality"));
        hm.put("Date",rs.getString("Date"));
        array.add(hm);
      }
    }
    catch (SQLException ex) {
      System.out.println(ex);
    }
    return array;
  }
}
Avatar billede simonvalter Praktikant
13. juli 2004 - 00:38 #3
Ok der ville jeg nok have et person objekt

og så bruger setters eller constructor til at sætte de forskellige properties.
Og så smider person objektet i din arraylist.

Jeg kan ikke rigtigt se hvorfor et hashmap skal blandes ind i det.
Avatar billede simonvalter Praktikant
13. juli 2004 - 00:40 #4
Hvis du vil overholde lidt god skik(performance) i forbindelser med databaser så skal du selecte precis hvad du vil hente ud og lade være med at bruge

select *
Avatar billede simonvalter Praktikant
13. juli 2004 - 00:42 #5
du kunne selvfølgelig også skippe brugen af arraylist og f.eks bruge cpr nr som key i et hashmap og person objektet som value og retunere det istedet.
Afhænger lidt af hvad det er du vil opnå.
Avatar billede m_els Nybegynder
13. juli 2004 - 00:46 #6
hehe...jeg er ikke den mest erfarne java programmør...som du nok kan se...

Kunne jeg lokke dig til at vise mig hvordan man laver et person objekt??
Skal nok give dig flere point...
Avatar billede simonvalter Praktikant
13. juli 2004 - 00:47 #7
flere point er ikke nødvendigt .. men det kan jeg godt.. sec
Avatar billede m_els Nybegynder
13. juli 2004 - 00:49 #8
mange tak
Avatar billede simonvalter Praktikant
13. juli 2004 - 01:02 #9
public HashMap getAllPersons()
    {
        HashMap map = new HashMap();
        try
        {
            stat = conn.createStatement();
            ResultSet rs = stat.executeQuery("SELECT Name,Surname,CPR,Areacode,Street,City,Tlf,Mobile,Nationality,Date FROM Personinfo");
            String name;
            String surname;
            String ssn;
            String areaCode;
            String street;
            String city;
            String telephone;
            String mobile;
            String nationality;
            Date date;
            Person person;
            while (rs.next())
            {
                name = rs.getString("Name");
                surname = rs.getString("Surname");
                ssn = rs.getString("CPR");
                areaCode = rs.getString("Areacode");
                street = rs.getString("Street");
                city = rs.getString("City");
                telephone = rs.getString("Tlf");
                mobile = rs.getString("Mobile");
                nationality = rs.getString("Nationality");
                date = rs.getString("Date");
                person = new Person(name, surname, ssn, areaCode, street, city,
                                    telephone, mobile, nationality, date);
                map.put(ssn, person);
            }
        }
        catch (SQLException ex)
        {
            System.out.println(ex);
        }
        return map;
    }


-----------
public class Person {
    private String name;
    private String surname;
    private String ssn;
    private String areaCode;
    private String street;
    private String city;
    private String telephone;
    private String mobile;
    private String nationality;
    private Date date;

    public Person(String name, String surname, String ssn, String areaCode,
                  String street, String city, String telephone, String mobile,
                  String nationality, Date date)
    {
        this.name = name;
        this.surname = surname;
        this.ssn = ssn;
        this.areaCode = areaCode;
        this.street = street;
        this.city = city;
        this.telephone = telephone;
        this.mobile = mobile;
        this.nationality = nationality;
        this.date = date;
    }

    public String getCity()
    {
        return city;
    }

    public Date getDate()
    {
        return date;
    }

    public String getMobile()
    {
        return mobile;
    }

    public String getName()
    {
        return name;
    }

    public String getSsn()
    {
        return ssn;
    }

    public String getStreet()
    {
        return street;
    }

    public String getSurname()
    {
        return surname;
    }

    public String getTelephone()
    {
        return telephone;
    }

    public String getAreaCode()
    {
        return areaCode;
    }

    public String getNationality()
    {
        return nationality;
    }

    public String toString()
    {
        // osv.
        return "ssn: " + ssn + " name: " + name + " surname: " + surname;
    }


------------
Avatar billede m_els Nybegynder
13. juli 2004 - 01:07 #10
smart! læg et svar og du får dine velfortjente point...
Avatar billede simonvalter Praktikant
13. juli 2004 - 01:17 #11
ok

arne hvis du ser det her kunne jeg egentligt godt tænke mig at vide om man burde sætte alle
String name;
String surname;
osv.
til null efter man kommer ud af while lykken
Hvis man forestiller sig at objektet som metoden er i lever videre
og metoden bliver brugt igen og igen vil referencen til de sidste strings jo forsvinde og blive garbage collected, men i mellemtiden lever den sidste iterations strings videre mellem brug af metoden.
hvis den ikke lever videre vil de vel blive garbage collected automatisk sammen med objektet.
Hvad vil være pænest?
Det er sjældent at jeg ser kode der implicit sætter objekter til null så nogen gang har jeg lidt svært ved at se hvornår jeg skal gøre det.
Avatar billede m_els Nybegynder
13. juli 2004 - 01:58 #12
Lige et sidste spørgsmål...jeg har nu sat det ind i min kode...men hvordan får jeg person objektet ud af hashmapet, så jeg kan bruge metoderne i person klassen...getName osv...
Avatar billede simonvalter Praktikant
13. juli 2004 - 02:07 #13
nu har du et hashmap så slår du bare op på nøglen

HashMap map = ditObject.getAllPersons();
Person person = (Person)map.get("ssn") // ssn = social security number
System.out.println(person);

Eller du kan få fat i dem alle med

  Iterator i = map.values().iterator();
        while(i.hasNext()){
            Person p = (Person) i.next();
        }
Avatar billede simonvalter Praktikant
13. juli 2004 - 02:10 #14
Jeg ved iøvrigt ikke hvad jeg tænkte der med garbage collection.
Når metoden retunerer forsvinder referencen til objekterne da variablerne er lokale og kan garbage collectes.

Så det må være med instance og class variabler at man implicit skal sætte referencen til null
Avatar billede simonvalter Praktikant
13. juli 2004 - 02:21 #15
et hashmap som du itererer igennem retunerer iøvrigt ikke personerne i nogen bestemt rækkefølge. Hvis du vil det skal du benytte et treemap og en comparator, hvis du da stadig vil benytte et map. Map har den fordel at det er meget hurtigt at slå en nøgle op og få retuneret et objekt.
Avatar billede m_els Nybegynder
13. juli 2004 - 02:24 #16
Perfekt...endnu engang mange tak!
Avatar billede simonvalter Praktikant
13. juli 2004 - 02:28 #17
det var så lidt.
Avatar billede arne_v Ekspert
13. juli 2004 - 09:08 #18
Man behøver aldrig sætte en objekt reference til null.

lokale variable bliver klar til gc når metoden afslutter

instans variable bliver klar til gc når det objekt de er en del af
bliver klar til gc

klasse variable bliver klar til gc når klassen unloades

Ikke bare er det unødvendigt at lave en masse sætten lig med null. I lang
de fleste tilfælde vil det påvirke performance negativt.

De bruges normalt af C/C++ programmører som savner deres free/delete
og/eller ikke har tillid til gc.

Undtagelserne er hvis man allokerer meget memory, ikke skal bruge
det længere og det varer meget lang tid inden det naturligt vil blive
klar til gc.

Eksempel:

byte[] b = new byte[100000000];
int i = getIntFrom100MB(b);
doSomethingForHours(i);

der vil en b = null nok være en god ide. Men det er altså en undtagelse.
Avatar billede simonvalter Praktikant
13. juli 2004 - 15:43 #19
Ok tak.
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