Avatar billede dennish Nybegynder
12. april 2007 - 18:51 Der er 4 kommentarer og
1 løsning

Hjælp til HashSet

Hej jeg har følgende kode:

public class Reader {
                                     
    private static final String BASE="C:/Java/eclipse/workspace/thesandbox/diverse/util/CSVReader/";
    private static final String CSVFILE=BASE+"fil.csv";
   
    public static void main(String[]args) {
    new Reader().openFile();
    }
        public void openFile() {
    int linecount = 0;
    try {
        File csvfile = new File(CSVFILE);
        CSVReader csvReader = new CSVReader(new InputStreamReader(new FileInputStream(csvfile), "ISO-8859-1"), ',');
        String[] nextLine;
        while ((nextLine = csvReader.readNext()) != null) {
        if (nextLine[0].trim().length() == 0) {
            linecount++;
            continue;
        }
        String countrystr = nextLine[6]+ " (" + nextLine[7] + ")";
        updateGroups(countrystr);
        linecount++;
        }
    }
    catch (Exception e) {
        System.out.println(e);
    }
    }
    public void updateGroups(String countrystr) {
    }
}

Jeg læser en linie("fra en kommasepereretfil") ad gange. "Bruger dog opencsv". String countrystr et land jeg henter fra filen. Jeg vil så gerne sammenligne dette land med de lande jeg har i min database. Hvis landet countrystr ikke er i database skal det tilføjes i databasen. Jeg bruger Hibernate. Jeg får returneret GroupModel objekter i mit GroupModel[] array. Det jeg så gerne vil er, at tjekke hver objekts String land attribut op i mod det jeg har hentet fra den kommasepererede fil (countrystr)

String query = "FROM GroupModel";
Query q = session.createQuery(query);
GroupModel[] groups = (GroupModel[])q.list().toArray(new GroupModel[0]);

Mit spørgsmål er følgende

Jeg Kunne godt iterer over samtlige groups og tjekke med equal.
for (int i=0; i<groups.length; i++) {
if(groups[i].equals(countrystr) {
  // gem i databasen
  }
}
Men jeg har ufattelige mange groups objekter og der vil tage lang tid at iterer over ale objekter. Kan jeg ikke med fordel kovertere mine objekter til en mængde  Set setGroups new HashSet();
og så tjekke på om countrystr er i mægden

if(setGroups.contains(countrystr))
{
  // gem i databasen
}
Efter sigende skulle et HashSet generer et unikt id for hvert objekt der er i mægden. Så når man forespørger efter et objekt.
Laves der et id for det forespurgte objekt hvorefter man slår op i  HashSet ud fra det pågældende id. Dvs. man bliver ikke nødt til at iterer igennem alle ens elementer i mængden.

Er mine antagelser forkeret
Kan være 100% sikker på at de id'er er bliver genereret til HashSet altid bliver generet unikt

Hvis de er unikke hvorfår jeg så nedenståede forskellige hashværder ? (4072869 er forskellg fra 1671711) Så jeg er lidt bange for at jeg ikke kan bruge HashSet.

String s = "ok";
StringBuffer sb = new StringBuffer(s);
System.out.println(s.hashCode()+"  "+sb.hashCode());
   
   
String t = "ok";
StringBuffer tb = new StringBuffer(t);
System.out.println(t.hashCode()+"  "+tb.hashCode());       

3548  4072869
3548  1671711
Avatar billede arne_v Ekspert
12. april 2007 - 19:22 #1
et HashSet er et Set og kan derfor kun indeholde en af hver

men hvad afgoer om noget er ens

der goer hashCode og equals

String er god fordi den har overriden disse to til noget som giver mening

StringBuffer har ikke overriden dem og bruger derfor dem den har arvet fra
Object, hvilket betyder at de kun er ens naar det er samme objekt
Avatar billede dennish Nybegynder
12. april 2007 - 20:28 #2
arne>> tusinde tak for dit svar. Er det egentlige en god ide at konvertere mit array til  en HashSet og så når jeg f.eks vil søge efter f.eks "kurt hansen" laver et opslag O(1) fremfor at skulle iterer igennem alle min elementer i arrayet.
Avatar billede arne_v Ekspert
12. april 2007 - 20:49 #3
jeg er ikke sikker paa at jeg helt forstaar din logik

men HashSet til at checke om noget eksisterer og HashMap til at slaa en vaerdi
op udfra en noegle er gode teknikker
Avatar billede dennish Nybegynder
17. april 2007 - 18:02 #4
takker arne>> smider du et svar ?
Endte med at bruge Set navn = new HashSet(); til at have en mængde uden duplikater :-)
Avatar billede arne_v Ekspert
17. april 2007 - 18:18 #5
ok
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