Hirdetés

Keresés

Új hozzászólás Aktív témák

  • modder
    aktív tag

    Definiáld felül a háromszög osztályban az Object ősosztály equals metódusát, és akkor adjon vissza igazat, ha a két háromszög területe megegyezik. Így amikor hozzáadogatod a háromszögeket a HashSet-hez, azok nem kerülnek bele a halmazba, amelyeknek a területe már szerepel.

    Kódban ez vhogy így néz ki (nálam most a háromszög osztályt Triangle-nek hívják):

    @Override
    public boolean equals(Object o) {
    if (o instanceof Triangle) {
    Triangle t = (Triangle) o;
    if (t.getArea() == getArea()) {
    return true;
    }
    }
    return false;
    }

    // A hashCode metódust is illik felüldefiniálni,
    // ha az equals-t felüldefiniálod. Az a lényeg,
    // hogy egyezzen meg annak a két objektumnak a hashkódja,
    // amelyekre az equals igazat ad vissza.
    @Override
    public int hashCode() {
    return (int) getArea(); // ezt lehet máshogy is, de a célnak megfelel
    }

    Én nem keverném ezt bele, mert az equals()-nak és a hashCode()-nak az egyedet kell tudnia azonosítania, és nem egyetlen tulajdonságát. Végtelenféle háromszöget lehet ugyanazzal a területtel. Szóval ez ellent mond a Java equals()-ra és hashCode()-ra vonatkozó contractjának.

    Nem is adna jó eredményt, mert a terület nagy valószínűséggel Float lesz, amit nem tudsz még javában sem alapból úgy összehasonlítani, hogy mindig jó eredményt kapj, pláne nem az == operátorral:
    http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Float.html#equals(java.lang.Object)

    Nem tudom mire kell itt a HashSet, de én úgy oldanám meg a dolgot memóriahatékonyan, hogy:
    1) csinálok egy ArrayList<Haromszog> haromszogek listát
    2) csinálok egy másik ArrayList<Float> teruletek listát
    3) ahogy generálom a háromszögeket a ciklusban, egy belső ciklusban minden legenerált háromszögre végigmegyek a 'területek' összes elemén és megnézem, hogy benne van-e az új háromszög területe, így:
    if(Math.abs( aktualisTerulet - ujHaromszogTerulet) < 0.001f)
    benne van
    else
    nincs benne, hozzáadom a háromszögekhez a háromszöget, és hozzáadom a az ujHaromszogTeruletet a teruletekhez

    Ha pontosabb float egyenlőség vizsgálat kell, ezt találtam neten http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

    esetleg gyorsabban futó megoldást is találhatsz, ha valamilyen orderes listet használsz pl http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#binarySearch(java.util.List, java.lang.Object, java.util.Comparator) -vel keresel a területek között

Új hozzászólás Aktív témák