Riešenia (skupina B, 12. týždeň)

Maven repozitar (treba pridať do pom.xml): https://search.maven.org/artifact/org.apache.commons/commons-math3/3.6.1/jar

package sk.upjs.umv;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.math3.util.ArithmeticUtils;

public class Zlomok extends Number implements Comparable<Zlomok> {

        private static final Zlomok POLOVICA = new Zlomok(1, 2);

        private final int citatel;
        private final int menovatel;

        public Zlomok(int citatel, int menovatel) {
                this.citatel = citatel;
                this.menovatel = menovatel;
        }

        public int getCitatel() {
                return citatel;
        }

        public int getMenovatel() {
                return menovatel;
        }

        @Override
        public String toString() {
                return citatel + "/" + menovatel;
        }

        // ak su rovnake objekty tak maju rovnaky hashCode

        // ak bol rozny hashCode tak su rozne objekty
        // ak bol rovnaky hashCode tak musime porovnat
        // = objekty su bud rozne alebo rovnake

        @Override
        public int hashCode() {
                // ??? - vygenerovane nie je postacujuce
                // problemovy vstup 1/2 a 2/4
                // dalsi problem zaporne cisla
                final int prime = 31;
                int result = 1;
                result = prime * result + citatel;
                result = prime * result + menovatel;
                return result;
        }

        @Override
        public boolean equals(Object obj) {
                if (this == obj)
                        return true;
                if (obj == null)
                        return false;
                if (getClass() != obj.getClass())
                        return false;
                Zlomok other = (Zlomok) obj;
                return citatel * other.menovatel == other.citatel * menovatel;
        }

        private void test() {
                double expected = 4.0;
                double calculated = getMenovatel();
                if (Math.abs(expected - calculated) > 0.001) {
                }
        }

        public double getValue() {
                return (double) citatel / menovatel;
        }

        @Override
        public double doubleValue() {
                return getValue();
        }

        @Override
        public float floatValue() {
                return (float) getValue();
        }

        /**
         * robi sa dolna cela cast
         */

        @Override
        public int intValue() {
                return (int) Math.floor(getValue());
        }

        @Override
        public long longValue() {
                return (long) Math.floor(getValue());
        }

        public Zlomok pripocitaj(Zlomok z) {
                if (menovatel == z.menovatel) {
                        return new Zlomok(citatel + z.citatel, menovatel);
                } else {
                        return new Zlomok(citatel * z.menovatel + z.citatel * menovatel, menovatel * z.menovatel);
                }
        }

        public Zlomok normalizuj() {
                int gcd = ArithmeticUtils.gcd(citatel, menovatel);
                // ak je menovatel zaporny tak prenasobit aj jedno aj druhe -1
                return new Zlomok(citatel / gcd, menovatel / gcd);
        }

        public static void main(String[] args) {
                Zlomok a = new Zlomok(1, 2);
                Zlomok b = new Zlomok(2, 4);
                System.out.println(a.equals(b));
                System.out.println(a.hashCode());
                System.out.println(b.hashCode());
                Zlomok c = new Zlomok(3, 4);
                Zlomok d = new Zlomok(7, 4);
                System.out.println(c.intValue());
                System.out.println(d.intValue());

                // dolna cela cast z -1.5 ma byt -2
                Zlomok e = new Zlomok(-3, 2);
                System.out.println(e.intValue());
                Zlomok f = new Zlomok(3, -2);
                System.out.println(e.equals(f));
                Zlomok g = new Zlomok(-1, -2);
                System.out.println(g.equals(a));

                List<Zlomok> list = new ArrayList<>();
                list.add(a);
                list.add(b);
                list.add(c);
                list.add(d);
                list.add(e);
                list.add(f);
                list.add(g);
                list.add(POLOVICA);
                System.out.println(list);
                Collections.sort(list);
                System.out.println(list);

        }

        // 1/2=0.5 vs 2/4=0.5
        @Override
        public int compareTo(Zlomok other) {
                // -1, 0, +1
                int com = Double.compare(getValue(), other.getValue());
                // su rovnake hodnoty
                if (com == 0) {
                        return Integer.compare(citatel, other.citatel);
                }
                return com;
        }

        public static Zlomok sucet(List<Zlomok> zlomky) {
                Zlomok vysledok = new Zlomok(0, 1);
                for (Zlomok zlomok : zlomky) {
                        vysledok = vysledok.pripocitaj(zlomok);
                }
                return vysledok;
        }

}