/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
sammenligning
Fra : René Holdgard Wilhar~


Dato : 26-10-01 18:45

Hej.

Jeg har lavet en klasse Broek. Den skal indeholde to metoder til
sammenligning: compareTo og equals
Jeg får tre compileringsfejl. Det er de tre kald jeg gør på rhs-objektet den
brokker sig over. Jeg forstår egentlig godt hvorfor, men jeg kan ikke finde
ud af hvordan jeg løser det og håber at i kan hjælpe.
Her er hvad jeg har gjort:

public class Broek implements Comparable
{
private long taeller;
private long naevner;

/* her kommer så en vældig masse metoder....de er udeladt her
Jeg sender gerne hele klassen hvis det kan hjælpe
*/

public int compareTo( Object rhs)
//PRE: input rhs (right-hand-side)
//POST: returnerer 0 hvis this-objektet == rhs,
// 1 hvis this-objektet > rhs,
// -1 hvis this-objektet < rhs
{
if( !(rhs instanceof Broek) || rhs == null)
throw( new ClassCastException());

if( this.equals( rhs))
return 0;

if( this.getRealValue() < rhs.getRealValue())
return -1;

else return 1;
}


public boolean equals( Object rhs)
//PRE: input rhs (right-hand-side)
//POST: returnerer true hvis this-objektet == rhs ellers false
{
if( rhs != null && rhs instanceof Broek)
{
if( this == rhs)
return true;

if( this.taeller == rhs.taeller && this.naevner == rhs.naevner)
return true;
}
return false;
}
}


Hilsen René



 
 
Mikkel Bundgaard (26-10-2001)
Kommentar
Fra : Mikkel Bundgaard


Dato : 26-10-01 19:09

René Holdgard Wilhardt <rhw@cadeye.dk> wrote in message
news:3bd99fdd$0$350$edfadb0f@dspool01.news.tele.dk...
> Hej.
>
> Jeg har lavet en klasse Broek. Den skal indeholde to metoder til
> sammenligning: compareTo og equals
> Jeg får tre compileringsfejl. Det er de tre kald jeg gør på
rhs-objektet den
> brokker sig over. Jeg forstår egentlig godt hvorfor, men jeg kan
ikke finde
> ud af hvordan jeg løser det og håber at i kan hjælpe.
> Her er hvad jeg har gjort:
>
> public class Broek implements Comparable
> {
> private long taeller;
> private long naevner;
>
> /* her kommer så en vældig masse metoder....de er udeladt her
> Jeg sender gerne hele klassen hvis det kan hjælpe
> */
>
> public int compareTo( Object rhs)
> file://PRE: input rhs (right-hand-side)
> file://POST: returnerer 0 hvis this-objektet == rhs,
> // 1 hvis this-objektet > rhs,
> // -1 hvis this-objektet < rhs
> {
> if( !(rhs instanceof Broek) || rhs == null)
> throw( new ClassCastException());
>
> if( this.equals( rhs))
> return 0;
>
> if( this.getRealValue() < rhs.getRealValue())
> return -1;
>
> else return 1;
> }
>
>
> public boolean equals( Object rhs)
> file://PRE: input rhs (right-hand-side)
> file://POST: returnerer true hvis this-objektet == rhs ellers
false
> {
> if( rhs != null && rhs instanceof Broek)
> {
> if( this == rhs)
> return true;
>
> if( this.taeller == rhs.taeller && this.naevner ==
rhs.naevner)
> return true;
> }
> return false;
> }
> }
>
>
> Hilsen René
>
Hej René

Det største problem med dine metoder er at du ikke cast'er det
indkomne object til den rigtige type. Her er et udkast til hvordan
de to metoder kan se ud (dog ikke teste):

public int compareTo( Object rhs) {
double thisVal = this.getRealValue();
double anotherVal = ( ( Broek ) rhs ).getRealValue();
return ( thisVal < anotherVal ? -1 :
( thisVal == anotherVal
? 0 : 1 ) );
}

og

public boolean equals( Object rhs ) {
if( this == rhs)
return true;

if( this.taeller == ( ( Broek ) rhs ).taeller &&
this.naevner == ( ( Broek ) rhs ).naevner )
return true;

return false;
}

Håber du kan bruge det til noget .
--
Mikkel Bundgaard
IT University of Copenhagen
http://officehelp.gone.dk
ICQ# 116946261
Se SpaceCommunicator - en peer-to-peer chat-applikation i Java



René Holdgard Wilhar~ (26-10-2001)
Kommentar
Fra : René Holdgard Wilhar~


Dato : 26-10-01 21:05

> Det største problem med dine metoder er at du ikke cast'er det
> indkomne object til den rigtige type.
Ja, jeg var klar over det, jeg var bare ikke lige klar over hvordan det
skulle gøres rigtigt.
Tusind tak for hjælpen, nu kører den.
René



Filip Larsen (26-10-2001)
Kommentar
Fra : Filip Larsen


Dato : 26-10-01 21:04

René Holdgard Wilhardt skrev

> Jeg har lavet en klasse Broek. Den skal indeholde to metoder til
> sammenligning: compareTo og equals

Som andre har bemærket, så mangler du en typecast for at få det til at
virke. For simple adaptorer kan jeg anbefale flg. delegeringsmønster for de
to metoder:

public class MyClass implements Comparable {
...
public boolean equals(Object obj)
{
if (this == obj) return true;
try {
MyClass other = (MyClass) obj;
return this.someValue.equals(other.someValue);
} catch (ClassCastException ex) {
return false;
} catch (NullPointerException ex) {
return false;
}
}

public int hashCode()
{
return this.someValue.hashCode();
}

public int compareTo(Object obj)
{
MyClass other = (MyClass) obj;
return this.someValue.compareTo(other.someValue);
}
}


Bemærk, at der i "equals" ikke benyttes "instanceof" operatoren, da det
efter sigende skulle være hurtigere at lave en typecast i en try-catch blok.
Grunden til, at jeg har skrevet typecast på en separat linie er, at hvis man
skal sammenligne flere felter i klassen ser det "grimt ud" med mange inline
typecasts.

I metoderne har jeg delegeret til et enkelt felt. Hvis klassen har mere end
et felt bliver man selvfølgelig nødt til selv at definere semantiken af sin
ordning i compareTo. En prioriteret ordning kan fx. laves som noget a la:

int sgn = this.someValue.compareTo(other.someValue);
if (sgn == 0) sgn =
this.someSecondValue.compareTo(other.someSecondValue);
if (sng == 0) sgn = ...;
...
return sgn;


Og husk, som altid når en klasse implementerer equals, så skal man også
implementere en hashCode metode således, at a.equals(b) altid medfører
a.hashCode() == b.hashCode().


Mvh,
--
Filip Larsen <filip.larsen@mail.dk>



Martin Ehmsen (26-10-2001)
Kommentar
Fra : Martin Ehmsen


Dato : 26-10-01 22:17

Filip Larsen wrote:
> Og husk, som altid når en klasse implementerer equals, så skal man
også
> implementere en hashCode metode således, at a.equals(b) altid medfører
> a.hashCode() == b.hashCode().

Hvis hastighed er af betydning er det faktisk vigtigt at a.equals(b)
hvis og kun hvis a.hashCode() == b.hashCode()
Det får fx. betydning i en hashTabel, men det er ikke direkte et krav.

Mvh.
Martin Ehmsen
--
Voulez vous couchez avec moi?



Filip Larsen (27-10-2001)
Kommentar
Fra : Filip Larsen


Dato : 27-10-01 09:34

Martin Ehmsen skrev

> Hvis hastighed er af betydning er det faktisk vigtigt at a.equals(b)
> hvis og kun hvis a.hashCode() == b.hashCode()
> Det får fx. betydning i en hashTabel, men det er ikke direkte et krav.

Bestemt, men det kan være ret svært at angive en generel metode for at lave
gode hash-værdier på en sammensat struktur. Jeg antog derfor for "nemheds
skyld" i mit eksempel, at de underliggende felter selv kunne beregne en god
hash-værdi (der så kan kombineres med fx. XOR).


Mvh,
--
Filip Larsen <filip.larsen@mail.dk>



René Holdgard Wilhar~ (26-10-2001)
Kommentar
Fra : René Holdgard Wilhar~


Dato : 26-10-01 22:36

Tak. Tror jeg nok. Jeg forstod ikke så meget. Jeg er på absolut
begynderniveau
René



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408927
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste