gpt4 book ai didi

Java TreeSet不添加对象

转载 作者:行者123 更新时间:2023-11-30 02:53:24 25 4
gpt4 key购买 nike

我正在尝试将对象添加到 Treeset 中,但并非所有对象都被添加。

class Fruits
{
String name ;
int weight;
int price;

Fruits(String n, int w, int p)
{
this.name=n;
this.weight=w;
this.price =p;
}

@Override
public int hashCode() {
System.out.println("hashcode called");
int prime =31;
int result =1;
result = prime*result +(this.name.hashCode()+this.price+this.weight);
return result;
}

@Override
public boolean equals(Object obj) {
System.out.println("Equals called");
if(null!=obj)
{
Fruits f= (Fruits) obj;
if(this.name.equals(f.name) && this.price==f.price && this.weight == f.price)
{
return true;
}
}
return false;
}
}

class FruitsComparator implements Comparator<Fruits>
{
//Order by Name, then quanity and then Price
@Override
public int compare(Fruits f1, Fruits f2)
{
if(f1.name.equals(f2.name) && f1.weight == f2.weight && f1.price == f2.price)
{
System.out.println(1);
return 0;
}
else if(f1.name.equals(f2.name) && f1.weight==f2.weight && f1.price < f2.price)
{
System.out.println(2);
return -1;
}
else if (f1.name.equals(f2.name) && f1.weight==f2.weight && f1.price > f2.price)
{
System.out.println(3);
return 1;
}
else if (f1.name.equals(f2.name) && f1.weight<f2.weight && f1.price == f2.price)
{
System.out.println(4);
return -1;
}
else if (f1.name.equals(f2.name) && f1.weight>f2.weight && f1.price == f2.price)
{
System.out.println(5);
return 1;
}
else if (f1.name.compareTo(f2.name) <1 && f1.weight==f2.weight && f1.price == f2.price)
{
System.out.println(6);
return -1;
}
else if (f1.name.compareTo(f2.name) >1 && f1.weight==f2.weight && f1.price == f2.price)
{
System.out.println(7);
return 1;
}
return 0;
}
}

来自另一个类的 public static void main。

Fruits f1= new Fruits("Apple",1,3);
Fruits f2= new Fruits("Apple",10,1);
Fruits f3= new Fruits("Apple",15,2);
Set<Fruits> sf = new TreeSet<Fruits>(new FruitsComparator());
sf.add(f1);
sf.add(f2);
sf.add(f3);
System.out.println("--Fruits Example--");
for( Fruits f: sf)
{
System.out.println(f.name+"-"+f.weight+"-"+f.price);
}

我得到的输出是:

--Fruits Example--
Apple-1-3

但是当我有如下所示的水果对象时,我得到了所有对象只是保持除了第三个元素之外的所有内容相同。 水果 f1= new Fruits("苹果",1,3); 水果 f2= new Fruits("苹果",1,1); 水果 f3= new Fruits("苹果",1,2);

得到的输出是

--Fruits Example--
Apple-1-1
Apple-1-2
Apple-1-3

因此,当我在重量和价格上保留不同的元素时,我的元素会被视为相同。我不明白为什么这些对象被视为相同。请帮忙。

最佳答案

主要问题是,您总是检查两个字段是否相等,只有一个字段不同。在最后的 else 中,如果至少有 2 个字段不同,就会发生这种情况,您返回 0,这意味着它们应该被视为相等,这就是您遇到此问题的原因。

由于您想要的顺序是先按名称排序,然后按数量排序,最后按价格排序,因此从第 4 个条件开始删除 && f1.price == f2.price,并删除 && f1.weight==f2.weight 最后两个。

<小时/>

如果您使用 Java 8 风格,则可以完全避免此问题。

Set<Fruits> sf = new TreeSet<Fruits>(Comparator.comparing(Fruits::getName)
.thenComparing(Fruits::getWeight)
.thenComparing(Fruits::getPrice)
);
<小时/>

我已在codiva - online java compiler ide中添加了工作代码。我还在 FruitsComparator.java 文件中包含了一个稍微简洁的实现。

关于Java TreeSet不添加对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37975154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com