【发布时间】:2018-06-05 20:53:31
【问题描述】:
目前我有一个 Fraction 类,它允许我以三种不同的方式创建 Fractions
- 对于一个整数,在这种情况下,给定的整数将是分子,分母将设置为 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"))*
应该返回真。
我查看了一些关于泛型和边界的章节,但我不确定这是否是我需要的正确方向。 Fraction 类是否应该绑定到 String 和 Integer?
【问题讨论】:
-
一般不需要==。您应该以分数为 .equal 为目标。
-
您的意思是正则表达式
-?\d+/[1-9]\d*,用\代替//? -
Fraction 类是否应该绑定到 String 和 Integer? 不。泛型是一个编译时类型安全系统,不会帮助您了解什么是 creational 问题。 您需要确保您返回单个引用;第一部分几乎肯定是让构造函数
private(或包私有),并使用创建模式。您需要填充(并维护)一个引用池。 -
是的,-?\d+/[1-9]\d* 是我的本意
-
@Trikalium 然后编辑问题并修复正则表达式。
标签: java generics fractions bounded-wildcard