热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaHashSet包含无法正常工作的函数

如何解决《JavaHashSet包含无法正常工作的函数》经验,为你挑选了1个好方法。

我正在写一个简单的程序如下:给定两个数字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#equalsObject#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;
}


推荐阅读
author-avatar
Mr_维力_811
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有