A12

Streda

package sk.upjs.umv;

import java.util.HashSet;
import java.util.Set;

import sk.upjs.jpaz2.*;

public class Launcher {

        public static void main(String[] args) {
                Zlomok polovica = new Zlomok(1, 2);
                System.out.println(polovica);
                System.out.println(polovica.getClass());

                Zlomok polovicaZnova = new Zlomok(1, 2);
                System.out.println(polovica.equals(polovicaZnova));
                Zlomok dveStvrtiny = new Zlomok(2, 4);
                System.out.println(polovica.equals(dveStvrtiny));
                Zlomok tretina = new Zlomok(1, 3);
                System.out.println(polovica.equals(tretina));

                Set<Zlomok> mnozina = new HashSet<>();
                mnozina.add(polovica);
                System.out.println(mnozina);
                mnozina.add(polovicaZnova);
                System.out.println(mnozina);
                mnozina.add(dveStvrtiny);
                System.out.println(mnozina);
                mnozina.add(tretina);
                System.out.println(mnozina);

        }
}
 
package sk.upjs.umv;

import javax.sql.CommonDataSource;

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

public class Zlomok {

        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;
        }

        @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;
                // dam oba zlomky do zakladneho tvaru a tie porovnam
                int thisGcd = ArithmeticUtils.gcd(getCitatel(), getMenovatel());
                int otherGcd = ArithmeticUtils.gcd(other.getCitatel(), other.getMenovatel());
                return getCitatel() / thisGcd == other.getCitatel() / otherGcd
                                && getMenovatel() / thisGcd == other.getMenovatel() / otherGcd;
        }

        // Euclidov algoritmus

        @Override
        public int hashCode() {
                int thisGcd = ArithmeticUtils.gcd(getCitatel(), getMenovatel());
                return getCitatel() / thisGcd + getMenovatel() / thisGcd;
        }

        public Zlomok pripocitaj(Zlomok z) {
                int novyCitatel = this.getCitatel() * z.getMenovatel() + z.getCitatel() * this.getMenovatel();
                int novyMenovatel = this.getMenovatel() * z.getMenovatel();
                return new Zlomok(novyCitatel, novyMenovatel);
        }

        public Zlomok normalizuj() {
                int novyCitatel = 0;
                int novyMenovatel = 0;
                if (getMenovatel() < 0) {
                        novyMenovatel = - getMenovatel();
                        novyCitatel = - getCitatel();
                }

                return new Zlomok(novyCitatel, novyMenovatel);
        }

}
 
<project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <groupId>PAZ1a</groupId>
        <artifactId>task12</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>

        <name>task12</name>

        <properties>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
                <maven.compiler.source>1.8</maven.compiler.source>
                <maven.compiler.target>1.8</maven.compiler.target>
                <exec.mainClass>PAZ1a.task12.Launcher</exec.mainClass>
        </properties>

        <dependencies>
                <dependency>
                        <groupId>sk.upjs</groupId>
                        <artifactId>jpaz2</artifactId>
                        <version>1.1.1</version>
                </dependency>
                <dependency>
                        <groupId>org.apache.commons</groupId>
                        <artifactId>commons-math3</artifactId>
                        <version>3.6.1</version>
                </dependency>
        </dependencies>

        <build>
                <plugins>
                        <plugin>
                                <groupId>org.apache.maven.plugins</groupId>
                                <artifactId>maven-shade-plugin</artifactId>
                                <version>3.0.0</version>
                                <configuration>
                                        <filters>
                                                <filter>
                                                        <artifact>*:*</artifact>
                                                        <excludes>
                                                                <exclude>META-INF/*.SF</exclude>
                                                                <exclude>META-INF/*.DSA</exclude>
                                                                <exclude>META-INF/*.RSA</exclude>
                                                        </excludes>
                                                </filter>
                                        </filters>
                                </configuration>
                                <executions>
                                        <execution>
                                                <phase>package</phase>
                                                <goals>
                                                        <goal>shade</goal>
                                                </goals>
                                                <configuration>
                                                        <transformers>
                                                                <transformer
                                                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                                                        <mainClass>${exec.mainClass}</mainClass>
                                                                </transformer>
                                                        </transformers>
                                                        <minimizeJar>true</minimizeJar>
                                                        <finalName>task12</finalName>
                                                </configuration>
                                        </execution>
                                </executions>
                        </plugin>
                </plugins>
        </build>


</project>

Štvrtok

package sk.upjs.umv;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class Launcher {

        public static void main(String[] args) {
//                Zlomok polovica = new Zlomok(1, 2);
//                System.out.println(polovica);
//                System.out.println(polovica.getClass());
//
//                Zlomok polovicaZnova = new Zlomok(1, 2);
//                System.out.println(polovica.equals(polovicaZnova));
//                Zlomok dveStvrtiny = new Zlomok(2, 4);
//                System.out.println(polovica.equals(dveStvrtiny));
//                Zlomok tretina = new Zlomok(1, 3);
//                System.out.println(polovica.equals(tretina));
//
//                Set<Zlomok> mnozina = new HashSet<>();
//                mnozina.add(polovica);
//                System.out.println(mnozina);
//                mnozina.add(polovicaZnova);
//                System.out.println(mnozina);
//                mnozina.add(dveStvrtiny);
//                System.out.println(mnozina);
//                mnozina.add(tretina);
//                System.out.println(mnozina);

                Zlomok tretina = new Zlomok(1, 3);
                Zlomok polovica = new Zlomok(1, 2);
                System.out.println(tretina.getDoubleValue());

                Number n = new Zlomok(1, 2);
                System.out.println(n);
                System.out.println(tretina.compareTo(tretina));

                List<Zlomok> zlomky = new ArrayList<>();
                zlomky.add(new Zlomok(2, 6));
                zlomky.add(new Zlomok(1, 3));
                zlomky.add(new Zlomok(2, 3));
                zlomky.add(new Zlomok(1, 2));
                zlomky.add(new Zlomok(20, 40));

                System.out.println(Zlomok.sucet(zlomky));
                System.out.println(Zlomok.POLOVICA);

                List<Zlomok> zoznam = new ArrayList<Zlomok>();
                for (int i = 0; i < 10; i++)
                        zoznam.add(Zlomok.POLOVICA);

                System.out.println(Zlomok.sucet(zoznam));

                System.out.println(tretina.roundValue());

                System.out.println(zlomky);
                Collections.sort(zlomky, new PorovnavacZlomkov());
                System.out.println(zlomky);

                Set<Zlomok> mnozina = new HashSet<>(zlomky);
                System.out.println(mnozina);

                Set<Zlomok> usporiadanaMnozina = new TreeSet<>(new PorovnavacZlomkov());
                usporiadanaMnozina.addAll(zlomky);
                System.out.println(usporiadanaMnozina);

        }
}
 
package sk.upjs.umv;

import java.util.Comparator;

public class PorovnavacZlomkov implements Comparator<Zlomok> {

        @Override
        public int compare(Zlomok o1, Zlomok o2) {
                // chceme porovnat vzdialenosti zlomkov k 1/2

                // d1 - vzdialenost medzi o1 a 1/2
                // d2 - vzdialenost medzi o2 a 1/2

                // instanca metoda v tejto triede
                // double d1 = this.distanceToHalf(o1);

                // staticka metoda v tejto triede (nie je potrebne pisat PorovnavacZlomkov)
                // double d1 = PorovnavacZlomkov.distanceToHalf(o1);

                // staticka trieda v triede zlomok
                // double d1 = Zlomok.distanceToHalf(o1);

                // instanca trieda v triede zlomok
                // double d1 = o1.distanceToHalf()

                // v triede zlomok
                double d1 = o1.distanceTo(Zlomok.POLOVICA);

                // double d2 = o2.distanceTo(Zlomok.POLOVICA);
                double d2 = Zlomok.POLOVICA.distanceTo(o2);

                return Double.compare(d1, d2);
        }


        // ukazka, ze niekedy zalezi na tom ako volame metody
        private static boolean test(String s) {
                // s.equals(nieco)
                String nieco = "nieco";
                if (s == null) {
                        return false;
                } else {
                        s.equals(nieco);
                }

                // nieco.equals(s)
                return nieco.equals(s);
        }

}
 
package sk.upjs.umv;

public interface Roundable {

        int roundValue();
}
 
package sk.upjs.umv;

import java.util.List;

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

public class Zlomok extends Number implements Comparable<Zlomok>, Roundable {

        private final int citatel;
        private final int menovatel;

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

        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;
        }

        @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;
                // dam oba zlomky do zakladneho tvaru a tie porovnam
                int thisGcd = ArithmeticUtils.gcd(getCitatel(), getMenovatel());
                int otherGcd = ArithmeticUtils.gcd(other.getCitatel(), other.getMenovatel());
                return getCitatel() / thisGcd == other.getCitatel() / otherGcd
                                && getMenovatel() / thisGcd == other.getMenovatel() / otherGcd;
        }

        // Euclidov algoritmus

        @Override
        public int hashCode() {
                int thisGcd = ArithmeticUtils.gcd(getCitatel(), getMenovatel());
                return getCitatel() / thisGcd + getMenovatel() / thisGcd;
        }

        public Zlomok pripocitaj(Zlomok z) {
                int novyCitatel = this.getCitatel() * z.getMenovatel() + z.getCitatel() * this.getMenovatel();
                int novyMenovatel = this.getMenovatel() * z.getMenovatel();
                return new Zlomok(novyCitatel, novyMenovatel);
        }

        public Zlomok normalizuj() {

                // int gcd = ArithmeticUtils.gcd(getCitatel(), getMenovatel());
                int gcd = najvacsiSpolocnyDelitel(getCitatel(), getMenovatel());
                int novyCitatel = 0;
                int novyMenovatel = 0;
                if (getMenovatel() < 0) {
                        novyMenovatel = -getMenovatel();
                        novyCitatel = -getCitatel();

                        return new Zlomok(novyCitatel / gcd, novyMenovatel / gcd);
                }

                return new Zlomok(getCitatel() / gcd, getMenovatel() / gcd);

        }

        private int najvacsiSpolocnyDelitel(int cislo1, int cislo2) {
                return ArithmeticUtils.gcd(cislo1, cislo2);
        }

        public double getDoubleValue() {
                return (double) getCitatel() / getMenovatel();
        }

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

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

        @Override
        public int intValue() {
                return (int) getDoubleValue();
        }

        @Override
        public long longValue() {
                return (long) getDoubleValue();
        }

        @Override
        public int compareTo(Zlomok o) {
                // porovnavanie na zaklade hodnot
//              return Double.compare(getDoubleValue(), o.getDoubleValue());

                // 2/6, 1/3, 2/3, 1/2, 20/40
                // 1/3, 2/6, 1/2, 20/40, 2/3
                // porovnavanie na zaklade hodnot a ak maju zlomky rovnaku hodnotu,
                // tak porovnavanie na zaklade menovatelov
                int porovnanie = Double.compare(getDoubleValue(), o.getDoubleValue());

                if (porovnanie == 0) {
                        return Integer.compare(getMenovatel(), o.getMenovatel());
                }

                return porovnanie;

                // takto by sme to mohli spravit pre vsetky pripady, ale aktualne to nebudem
                // robit
//              if (getCitatel() * o.getMenovatel() == getMenovatel() * o.getCitatel()) {
//                      return 0;
//              }              

        }

        public static Zlomok sucet(List<Zlomok> zlomky) {
                // int vysledok = 0
                // vo for each cykle sme len priratavali hodnoty
                // return vysledok;

//              Zlomok vysledok = new Zlomok(0, 1);
//
//              for (Zlomok zlomok : zlomky) {
//                      vysledok = vysledok.pripocitaj(zlomok);
//              }
//
//              return vysledok.normalizuj();

                // iny sposob ako implementovat sucet
                Zlomok vysledok = null;

                for (Zlomok zlomok : zlomky) {
                        if (vysledok == null) {
                                vysledok = zlomok;
                        } else {
                                vysledok = vysledok.pripocitaj(zlomok);
                        }
                }

                return vysledok.normalizuj();
        }

        @Override
        public int roundValue() {
                return (int) Math.round(getDoubleValue());
        }

        public double distanceTo(Zlomok zlomok) {
                return Math.abs(getDoubleValue() - zlomok.getDoubleValue());
        }

}