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