Jeg skal bruge metoderne equals() og hashCode() og bruge CPRnummer som nøgle. CPRnummeret skal først castes til en Integer. Gør jeg det rigtigt?? class Studerende { private String Navn; private int CPRNummer; // Skal castes til Integer private int Alder; public Object[] arr = new Object[10];
public Studerende(String navn, int CPRnummer, int alder) { this.Navn = navn; this.CPRNummer = CPRnummer; this.Alder = alder; }
public Integer hashCode() { Integer nr = (Integer)CPRNummer; return nr.hashCode(); } /* public equals() { ; } */ }
Mit fejl output er : Pro\MyProjects\ADT\ADT\HashStuderende\Studerende.java:18: hashCode() in Studerende cannot override hashCode() in java.lang.Object; attempting to use incompatible return type found : java.lang.Integer required: int public Integer hashCode()
DVS. public int hashCode() { Integer nr = new Integer(CPRNummer); return nr.hashCode(); } Men det er returnerer er jo Integer object ikke? Men min retur type er en int, hvordan det?
ja okay så faldt 10-øren. Nå men så må jeg hellere finde en anden nøgleværdi.
Er det så rigtigt forstået mht. equals() Hvis jeg indsætter to eller flere objecter(personer) i array kan jeg sammenligne deres nøgleværdier med equals() metoden??
Lad os lige tage een ting af gangen. Ja int/Integer er for lille. Du kunne bruge long/Long - men ret beset er et CPR-nummer ikke et tal. Du skal aldrig lægge dem sammen fx. Og foranstillede 0'er forsvinder ved udskrift.
Hvad siger du til et forslag om at lade et CPRnummer være en String ?
Hashmap? Ja, hvis det er for eksemplets skyld - og det er det jo nok - så kan du jo f.x bruge de første 6 cifre.
Equals? Om to objekter er ens kan være en træls affære at checke, da der kan være mange delvariabler. Så det man plejer at gøre, er at check de 2 objekters hashcode. Er de forskellige, så er objekterne også forskellige (ellers er hashCode-metoden lavet forkert). Er de to hashCode værdier ens, er objekterne MÅSKE ens, og så er man nødt til at checke om alle delvariabler også er ens.
Hvis du skal checke diverse ting udfra CPR nummer, så kan jeg du låne lidt fra følgende kode:
import java.util.*;
public class CPR { // format of danish CPR number: // ddmmyy-nnnc // where: // dd = day // mm = month // yy = year // nnn = sequence (includes century) // c = checksum (includes sex) private String number;
// constructor public CPR(String number) { this.number = number; }
// check validity public boolean isValid() { int[] ix = { 0, 1, 2, 3, 4, 5, 7, 8, 9, 10 }; int[] c = { 4, 3, 2, 7, 6, 5, 4, 3, 2, 1 }; if (number.length() != 11) { return false; } if (number.charAt(6) != '-') { return false; } for (int i = 0; i < 10; i++) { if (!Character.isDigit(number.charAt(ix[i]))) { return false; } } if (dd() > 31) { return false; } if (mm() > 12) { return false; } if (century() == 0) { return false; } int temp = 0; for (int i = 0; i < 10; i++) { temp = temp + c[i] * numericValue(number.charAt(ix[i])); } return ((temp % 11) == 0); }
// check make/female public boolean isMale() { return odd(numericValue(number.charAt(10))); } public boolean isFemale() { return even(numericValue(number.charAt(10))); }
// get date of birth public Date getBirth() { int year = yy() + century(); int mon = mm() - 1; int mday = dd(); GregorianCalendar temp = new GregorianCalendar(); temp.set(year, mon, mday); return temp.getTime(); }
// get age public int getAge() { Calendar now = GregorianCalendar.getInstance(); Calendar born = new GregorianCalendar(); born.setTime(getBirth()); int result; result = now.get(Calendar.YEAR) - born.get(Calendar.YEAR); if (now.get(Calendar.DAY_OF_YEAR) < born.get(Calendar.DAY_OF_YEAR)) { result--; } return result; }
// standard methods public int hashCode() { return number.hashCode(); } public boolean equals(Object o) { if(o instanceof CPR) { return number.equals(((CPR)o).number); } else { return false; } }
// get parts private int dd() { return Integer.parseInt(number.substring(0, 2)); } private int mm() { return Integer.parseInt(number.substring(2, 4)); } private int yy() { return Integer.parseInt(number.substring(4, 6)); }
// calculate century private int century() { switch (numericValue(number.charAt(7))) { case 0 : case 1 : case 2 : case 3 : return 1900; case 4 : case 9 : if (yy() < 37) return 2000; else return 1900; case 5 : case 6 : case 7 : case 8 : if (yy() < 37) return 2000; else if (yy() > 57) return 1800; else return 0; default : return 0; } }
erik> Jeg forstå ikke dit argument for at bruge hashCode i equals. Meget ofte vil hashCode jo skulle have fat i alle delvariablene alligevel. Så jeg kan ikke se gevindsten.
Jeg værdsætter meget den hjælp der gives her, men jeg bliver sgu lidt forvirret! Arne du skriver:" hashCode og HashMap har ikke så meget med hinanden gøre (den sidste bruger kun den første)". Hvad er hashCode og HashMap så???? Er HashMap ikke ligesom et array? Og hashCode er en metode som HashMap kan bruge for at få returneret en bestemt værdi (ud fra objektet)?
Og jeg forstår ikke hvor HashMap kommer ind i billedet.
Hvis du vil bruge objekter af typen Studerende som key, så skal du bruge hashCode og equals for Studerende, men hvad skal så være value ??
Hvis du vil bruge Studerende som value og CPR nummer som key, så behøver du ikke bøvle med hashCode og equals for Studerende (og både Integer og String har dem allerede, så du skal heller ikke lave dem for CPR nummer).
HashMap er nok noget jeg har forvildet ind i hovedet. Men det er det sidste forslag jeg skal arb. med. Da dette er min opgave bliver jeg dog nødt til at bøvle med hsahCode og equals: - Lave en klasse 'Studerende' med nogle passende atributter. (nummer, navn m.v.) - Overloade metoderne equals() og hashCode() på klassen 'Studerende'. Brug f.eks. cprnummer som nøgle. - Placere et antal forekomster af 'Studerende' i et array på grundlag af objektets hashCode. - Genfinde objekterne på grundlag af deres nøgle.
En hash map (java eller din egen) har keys og values.
Hvad er key og hvad er value ?
Umiddelbart skulle jeg tro at CPRNummer var key og Studerende var value ! Og så behøver du ikke hashCode for Studerende, da man kun skal hashe keyen ikke value.
* man har et array med keys og values * put kalkulerer en hash af af key og indsætter key-value på en position udfra den hash * get leder efter value udfra key ved at man kalkulerer hash og kigger i den position i arrayet
(man skal så lige kunen håndtere situationen med to keys med samme hash value)
Derfor er det kun hashCode af key der er interessant.
Synes godt om
Ny brugerNybegynder
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.