为什么我的数组输出结果顺序跟老师的不一样

为什么我的数组输出结果顺序跟老师的不一样

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

你好同学,问题的主要原因出在了你的hashcode方法上,你的hashcode方法没有result = prime * result + ((name == null) ? 0 : name.hashCode());对名字进行判断的胆码, 建议同学使用如下方式进行创建,按Alt+Shift+S,然后选择下图标记的选项来创建方法。这样不会出现遗漏的错误。

http://img1.sycdn.imooc.com//climg/5c8a2fc9000127a304030434.jpg

修订之后的代码如下,祝学习愉快~

public class Cat {
    private String name; //名字
    private int month; //年龄
    private String species;//品种
    
    //构造方法
    public Cat(String name, int month, String species) {
        super();
        this.name = name;
        this.month = month;
        this.species = species;
    }
    //getter与setter方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public String getSpecies() {
        return species;
    }

    public void setSpecies(String species) {
        this.species = species;
    }
    @Override
    public String toString() {
        return "[姓名:" + name + ", 年龄:" + month + ", 品种:" + species + "]";
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + month;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((species == null) ? 0 : species.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Cat other = (Cat) obj;
        if (month != other.month)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (species == null) {
            if (other.species != null)
                return false;
        } else if (!species.equals(other.species))
            return false;
        return true;
    }

    
    
}


  • 巴呆丶 提问者 #1
    老师,我用的不是eclips而是Intellj IDEA,也是自动生成的,出来就跟老师用的eclipse生成的不太一样,对这个重写HashCode和equals方法我也不是特别熟悉,所以也不会修改。
    2019-03-14 19:44:25
  • 好帮手慕阿莹 回复 提问者 巴呆丶 #2
    其实这个输出顺序并不重要,同学不必在意,只要用idea或者eclipse的自动生成的方式都不会出错,尤其是Set集合,本身对顺序就是没有要求的。所以同学继续使用idea的自动生成的HashCode和equals方法就可以了。如果对顺序有要求,可以用List集合。祝学习愉快
    2019-03-15 10:01:09
提问者 巴呆丶 2019-03-14 17:42:44
public class Cat {
    private String name;    //姓名
    private int month;      //年龄
    private String specise; //品种

    public Cat() {
    }

    public Cat(String name, int month, String specise) {
        this.name = name;
        this.month = month;
        this.specise = specise;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        this.month = month;
    }

    public String getSpecise() {
        return specise;
    }

    public void setSpecise(String specise) {
        this.specise = specise;
    }

    @Override
    public String toString() {
        return "{姓名:" + name +   ", 年龄: " + month + ", 品种: " + specise+"}";
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Cat)) return false;

        Cat cat = (Cat) o;

        if (getMonth() != cat.getMonth()) return false;
        if (getName() != null ? !getName().equals(cat.getName()) : cat.getName() != null) return false;
        return getSpecise() != null ? getSpecise().equals(cat.getSpecise()) : cat.getSpecise() == null;
    }

    @Override
    public int hashCode() {
        int result = getName() != null ? getName().hashCode() : 0;
        result = 31 * result + getMonth();
        result = 31 * result + (getSpecise() != null ? getSpecise().hashCode() : 0);
        return result;
    }
}
//=============================================================
public class CatTest {
    public static void main(String[] args) {
        Cat one = new Cat("花花",12,"英国短毛猫");
        Cat two = new Cat("凡凡",3,"中华田园猫");
        Set set = new HashSet();
        set.add(one);
        set.add(two);
        //打印输出宠物猫信息
        Iterator it = set.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println("*********************");
        Cat once = new Cat("花花",12,"英国短毛猫");
        set.add(once);
        System.out.println("添加重复信息后的宠物猫信息:");
        it = set.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
        System.out.println("**********************");
        //插入一个新的宠物猫
        Cat one2 = new Cat("花花二代",2,"英国短毛猫");
        set.add(one2);
        System.out.println("添加花花二代后的宠物猫信息: ");
        it = set.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }

        System.out.println("**********************");
        //在集合中查找花花的信息并输出
        if(set.contains(one)) {
            System.out.println("花花找到了");
            System.out.println(one);
        }else {
            System.out.println("花花没找到");
        }
        //根据集合中的花花名字查找信息
        boolean flag = false;   //定义一个值为false的Boolean类型变量flag
        Cat c = null;           //定义一个Cat对象初始化内容为null,方便在后面的输出语句中调用
        it = set.iterator();    //重置迭代器
        while (it.hasNext()) {      //遍历数组
            c = (Cat) it.next();    //将数组内容传给对象c
            if (c.getName().equals("花花")) {     //判断对象中getName获得的姓名是否等于”花花“
                flag = true;        //如果等于,则找到了,将flag重新赋值为true
                break;          //跳出循环
            }
        }

        if (flag) {     //如果flag为true
            System.out.println("花花找到了");    //输出字符串”花花找到了“
            System.out.println(c);             //输出此时c中的内容
        }else {
            System.out.println("花花没找到");    //flag为false输入字符串"花花没找到"
        }
    }
}


chrismorgen 2019-03-14 17:36:43

你好同学,请问你的代码是如何写的呢?你应该是没有排序吧,建议同学将你的代码粘贴到“我要回答中”,否则会失去代码格式,这样方便老师为你修改错误,祝学习愉快~

  • 提问者 巴呆丶 #1
    好的请稍等
    2019-03-14 17:41:11
  • 提问者 巴呆丶 #2
    我已经粘贴了代码,请老师看看
    2019-03-14 18:00:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师