gpt4 book ai didi

java - 将多个 Address 对象从 Person 类存储到 TreeSet 中

转载 作者:行者123 更新时间:2023-12-03 18:42:27 25 4
gpt4 key购买 nike

基本上,我要做的是为每个 Person 对象存储多个地址。我决定通过将 Address 对象存储在 Person 类的 TreeSet 中来实现这一点。本质上,我想将我创建的每个地址对象的 toString() 存储到我的 TreeSet 中。我通过 Person 类的 addAddress() 方法传递 Address 对象的属性,该方法将属性传递给 Address 类的构造函数。

我在指定行收到一个错误...

public class Person {
private TreeSet<Address> addresses = new TreeSet<Address>();

public void addAddress(String type, String street, String city, String state, String zip) {
//ERROR ON THIS LINE BELOW
Address addressObj = new Address(type, street, city, state, zip);
addresses.add(addressObj);
}
}

public class Address {
private String type;
private String street;
private String city;
private String state;
private String zip;

@Override
public String toString() {
return street + " " + city + " " + ", " + state + " " + zip + ": " + type;
}

public Address(String type, String street, String city, String state, String zip) {
super();
this.type = type;
this.street = street;
this.city = city;
this.state = state;
this.zip = zip;
}
}


public class MainDriver {

public static void main(String[] args) {
Person p1 = new Person();
p1.addAddress("Home", "321 Den Ave", "Orlando", "FL", "32792");
p1.addAddress("Work", "4411 Alligator Court", "Orlando", "FL", "32792");
}
}

这是错误信息:

Exception in thread "main" java.lang.ClassCastException: Address cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(TreeMap.java:1294)
at java.util.TreeMap.put(TreeMap.java:538)
at java.util.TreeSet.add(TreeSet.java:255)
at Person.addAddress(Person.java:64)
at MainDriver.main(MainDriver.java:9)

明确一点:我不想将地址存储在一个字符串中,因为我希望以后能够单独操作每个属性。我也不希望 Address 类属性存储在 Person 类中,因为我需要 Address 类的多次迭代才能为每个 Person 对象存储多个地址。

最佳答案

问题是,要将某些东西放入 TreeSet,它们必须具有可比性。这是因为树集会尝试以树结构排列您的项目。如果不能,则会抛出异常,因此您放入树集中的所有内容都必须实现 Comparable

但是,地址不能进行逻辑比较,不是吗?为地址编写一个 compareTo 方法真的很难。您如何确定一个地址是否比另一个地址“更大”?

因此,我认为TreeSet 不是适合此目的的数据结构。我建议您改用 HashSet。哈希集要求您的项目实现hashCode,这是一种返回该对象唯一的数字的方法,并且等于。如果对象的哈希码相等,则这两个对象在逻辑上也相等。

您可以使用 Objects.hash 来帮助您实现这一点:

@Override
public int hashCode() {
return Objects,hash(type, street, city, state, zip);
}

或者,使用您的 IDE 生成的实现之一。这是我的 IntelliJ IDEA 得到的结果:

@Override
public int hashCode() {
int result = type.hashCode();
result = 31 * result + street.hashCode();
result = 31 * result + city.hashCode();
result = 31 * result + state.hashCode();
result = 31 * result + zip.hashCode();
return result;
}

equals 方法也应该被实现。你可以这样做:

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

Address address = (Address) o;

if (!type.equals(address.type)) return false;
if (!street.equals(address.street)) return false;
if (!city.equals(address.city)) return false;
if (!state.equals(address.state)) return false;
return zip.equals(address.zip);

}

关于java - 将多个 Address 对象从 Person 类存储到 TreeSet 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46701958/

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