代码改变世界

支持查找功能的分数类 7(有几个函数很有用)

2011-05-02 23:35  Rollen Holt  阅读(609)  评论(0编辑  收藏  举报
1 //测试类
2 //范例1-3 支持查找功能的分数类 7
3 //∷相关函数:compareTo函数
4
5 public class Exec2 {
6 public static void main(String[] args) {
7 // 创建两个分数类变量
8 Fraction fraction1 = new Fraction(0.25);
9 Fraction fraction2 = new Fraction(2, 8);
10
11 // 分数相加
12 Fraction fraction3 = fraction1.add(fraction2);
13 System.out.println(fraction1 + "+" + fraction2 + "=" + fraction3);
14
15 // 创建含有5个元素的分数类变量数组
16 Fraction[] fractions = { new Fraction(1, 3), new Fraction(1, 5),
17 new Fraction(1, 2), new Fraction(1, 4), new Fraction(1, 10) };
18
19 // 对数组排序,并使用二分折半查找方法来搜索指定分数类变量
20 java.util.Arrays.sort(fractions);
21
22 // 输出命中类变量的下标位置
23 System.out.println("搜索的分数是第"
24 + java.util.Arrays.binarySearch(fractions, fraction3) + "个!");
25 }
26 }
27
28 // 支持查找功能的分数类
29 class Fraction implements Comparable {
30 // 分子
31 private int numerator;
32
33 // 分母
34 private int denominator;
35
36 // 默认构造函数
37 public Fraction() {
38 }
39
40 // 该构造函数对分子和分母进行初始化
41 public Fraction(int n, int d) {
42 setFraction(n, d);
43 }
44
45 // 该构造函数支持将双精度数转换为相应的分数
46 public Fraction(double d) {
47 convertToFraction(d);
48 }
49
50 // 该函数可以将双精度数转换为相应的分数
51 private void convertToFraction(double d) {
52 int decimalCount = 1;
53
54 // 求双精度数的字符长度
55 int dLen = String.valueOf(d).length();
56
57 // 不断的将双精度数累乘10,直至转换为整数为止
58 for (int i = 0; i < dLen; i++) {
59 d = d * 10;
60 decimalCount *= 10;
61
62 }
63
64 // 分子为最终的整数乘积结果
65 numerator = (int) d;
66
67 // 分母为10的累乘结果
68 denominator = decimalCount;
69
70 // 约分
71 reduct();
72 }
73
74 // 分子的设置函数,并且约分
75 public void setNumerator(int n) {
76 numerator = n;
77 reduct();
78 }
79
80 // 分子的读取函数
81 public int getNumerator() {
82 return numerator;
83 }
84
85 // 分母的设置函数,并且约分
86 public void setDenominator(int d) {
87 // 检查分母是否为0
88 if (d == 0)
89 denominator = 1; //建议采用异常
90 else
91 denominator = d;
92 reduct();
93 }
94
95 // 分母的读取函数
96 public int getDenominator() {
97 return denominator;
98 }
99
100 // 分数的设置函数,并且约分
101 public void setFraction(int n, int d) {
102 setNumerator(n);
103 setDenominator(d);
104 reduct();
105 }
106
107 // 格式化字符信息输出
108 public String toString() {
109 // 如果为负分数,则将负号提前显示,分子和分母保留为正数,否则分子和分母皆取正数
110 if (numerator * denominator < 0)
111 return "-" + Math.abs(numerator) + "/" + Math.abs(denominator);
112 else
113 return Math.abs(numerator) + "/" + Math.abs(denominator);
114 }
115
116 // 利用对应小数值是否相同来判断分数是否相同
117 public boolean equals(Fraction f) {
118 if (numerator == f.numerator && denominator == f.denominator)
119 return true;
120 else
121 return false;
122 }
123
124 // 利用对应小数值的大小来判断分数的大小
125 public boolean isGreater(Fraction f) {
126 if ((double) numerator / denominator > (double) f.numerator
127 / f.denominator)
128 return true;
129 else
130 return false;
131 }
132
133 // 约分函数
134 private void reduct() {
135 // 求分子和分母的最小值
136 int minValue = Math.min(Math.abs(numerator), Math.abs(denominator));
137
138 // 将小于分子和分母的最小值的数值,从大到小去除分子和分母,如果能够同时被整除,则以此数值约分并退出
139 for (int i = minValue; i >= 1; i--) {
140 if (numerator % i == 0 && denominator % i == 0) {
141 numerator = numerator / i;
142 denominator = denominator / i;
143 break;
144 }
145 }
146 }
147
148 // 返回分数相加的结果,并且约分
149 public Fraction add(Fraction f) {
150 Fraction fraction = new Fraction();
151 fraction.numerator = numerator * f.denominator + f.numerator
152 * denominator;
153 fraction.denominator = denominator * f.denominator;
154 fraction.reduct();
155 return fraction;
156 }
157
158 // 返回分数相减的结果,并且约分
159 public Fraction minus(Fraction f) {
160 Fraction fraction = new Fraction();
161 fraction.numerator = numerator * f.denominator - f.numerator
162 * denominator;
163 fraction.denominator = denominator * f.denominator;
164 fraction.reduct();
165 return fraction;
166 }
167
168 // 返回分数相乘的结果,并且约分
169 public Fraction multiply(Fraction f) {
170 Fraction fraction = new Fraction();
171 fraction.numerator = numerator * f.numerator;
172 fraction.denominator = denominator * f.denominator;
173 fraction.reduct();
174 return fraction;
175 }
176
177 // 返回分数相除的结果,并且约分
178 public Fraction divide(Fraction f) {
179 Fraction fraction = new Fraction();
180 fraction.numerator = numerator * f.denominator;
181 fraction.denominator = denominator * f.numerator;
182 fraction.reduct();
183 return fraction;
184 }
185
186 // 支持两个分数类变量的比较,以实现分数集合的查找功能
187 public int compareTo(Object o) {
188 Fraction f = (Fraction) o;
189
190 // 利用对应小数的大小来比较分数的大小
191 if ((double) numerator / denominator > (double) f.numerator
192 / f.denominator)
193 return 1;
194 else if ((double) numerator / denominator < (double) f.numerator
195 / f.denominator)
196 return -1;
197 else
198 return 0;
199 }
200
201 // 根据对应小数是否相同来判断分数是否相同
202 public boolean equals(Object obj) {
203 Fraction f = (Fraction) obj;
204 if (Math.abs((double) numerator / denominator - (double) f.numerator
205 / f.denominator) < 0.00001)
206 return true;
207 return false;
208 }
209
210 // 相同数值的分数返回相同的哈希码
211 public int hashcode() {
212 String str = String.valueOf((double) numerator / denominator);
213 return str.hashCode();
214 }
215
216 }