На данный момент у меня есть класс Fraction, который позволяет мне создавать дроби тремя различными способами
- С одним целым числом, в данном случае данное целое число будет числителем, а знаменатель будет установленв 1
- При 2 целых числах числитель и знаменатель
- Последний метод заключается в разборе строки, которая должна соответствовать REGEX -? \ d + / [1-9] \ d*
Сгенерированные фракции будут максимально уменьшены с помощью gcd.
public class Fraction extends Number {
public static final String REGEX = "-?\d+/[1-9]\d*";
public static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
public static Fraction parseFraction(String s) {
if (!s.matches(REGEX)) {
throw new RuntimeException("Parsing error");
}
String[] splitted = s.split("/");
return new Fraction(Integer.parseInt(splitted[0]),
Integer.parseInt(splitted[1]));
}
private int numerator;
private int denominator;
public Fraction(int numerator) {
this(numerator, 1);
}
public Fraction(int numerator, int denominator) {
if (denominator == 0) {
throw new RuntimeException("denominator == 0 is not possible");
}
int gcd = Fraction.gcd(numerator, denominator);
if (denominator / gcd < 0) {
gcd *= -1;
}
this.numerator = numerator / gcd;
this.denominator = denominator / gcd;
}
}
Теперь я хочу реализовать то, что Экземпляры дроби с одинаковыми числителем и знаменателем имеютта же ссылка, например,
*Fraction.parseFraction("1/2").equals(Fraction.parseFraction("2/4"))*
должна возвращать true.
Я изучил некоторые главы об Общих и Границах, но я не уверен, является ли это даже правильным направлением того, что мне нужно.Должен ли класс Fraction быть привязан к String и Integer?