相同的实例应具有相同的参考

时间:2018-06-05 20:53:32

标签: java generics fractions bounded-wildcard

目前我有一个课程分数,允许我以三种不同的方式创建分数

  • 使用一个整数,在这种情况下,给定的整数将是分子,分母将被设置为1
  • 使用2个整数,分子和分母
  • Last方法是解析必须与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吗?

1 个答案:

答案 0 :(得分:0)

  

我现在要实现的是具有相同分子和分母的分数实例具有相同的参考值。

我认为你的意思是相同的价值吗?

你会遇到使用整数来计算这个价值的问题(以及使用浮点数或双精度计算) - 弄清楚为什么这些事情很困难,以及如何减轻它们,会教会你很多。

阅读String.intern()的内容(例如,这只是Google的第一个结果:https://dzone.com/articles/string-interning-what-why-and),并执行相同的操作,但适用于您的Fraction类。