作者:Mr_维力_811 | 来源:互联网 | 2023-05-27 11:10
我正在写一个简单的程序如下:给定两个数字M和N,p来自[M,N],q来自[1,p-1],找到p/q的所有不可约分数.我的想法是蛮力所有可能的p,q值.并使用HashSet来避免重复的分数.但是,不知何故,contains函数没有按预期工作.
我的代码
import java.util.HashSet;
import java.util.Set;
public class Fraction {
private int p;
private int q;
Fraction(int p, int q) {
this.p = p;
this.q = q;
}
public static int getGCD(int a, int b) {
if (b == 0)
return a;
else
return getGCD(b, a % b);
}
public static Fraction reduce(Fraction f) {
int c = getGCD(f.p, f.q);
return new Fraction(f.p / c, f.q / c);
}
public static HashSet getAll(int m, int n) {
HashSet res = new HashSet();
for (int p = m; p <= n; p++)
for (int q = 1; q res = getAll(2, 4);
for (Fraction f : res)
print(f);
}
}
这是程序的输出
4/3
3/1
4/1
2/1
3/2
2/1
你可以看到分数2/1是重复的.任何人都可以帮我弄清楚为什么以及如何解决它.非常感谢.
1> Niels Billen..:
覆盖Object#equals
和Object#hashCode
.这些在内部用于确定两个对象是否相同.我想当你不覆盖它们时,equals方法测试对象地址的相等性而不是它们的内部表示.
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + p;
result = prime * result + q;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Fraction other = (Fraction) obj;
if (p != other.p)
return false;
if (q != other.q)
return false;
return true;
}