2017-10-12 8 views
2

基本的には、各Personオブジェクトに複数のアドレスを格納するのが基本です。私は、PersonクラスのTreeSetにAddressオブジェクトを格納することでこれを達成することにしました。基本的には、作成した各AddressオブジェクトのtoString()をTreeSetに格納したいと考えています。 Addressクラスのコンストラクタにプロパティを渡すPersonクラスのaddAddress()メソッドを通じて、Addressオブジェクトのプロパティを渡します。PersonクラスからTreeSetに複数のAddressオブジェクトを格納する

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) 

明確にする:

私は指定された行にエラーが表示される...ここ

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"); 
    } 
} 

はエラーメッセージです私は1つの文字列のアドレスを格納する必要はありません後で個々のプロパティを個別に操作できるようにしたいからです。また、各Personオブジェクトの複数のアドレスを格納できるように、Addressクラスの複数の繰り返しが必要なため、PersonクラスにAddressクラスのプロパティを格納する必要はありません。

答えて

2

問題はTreeSetのに何かを置くために、である、彼らは同等でなければなりません。これは、ツリーセットがツリー構造内にアイテムを配置しようとするためです。例外がスローされない場合は、ツリーセットに入れるすべての要素にComparableを実装する必要があります。

ただし、アドレスを論理的に比較することはできません。アドレスのためにcompareToメソッドを書くことは本当に難しいです。あなたの住所が別のものより「大きい」かどうかはどうやって判断しますか?

したがって、私はTreeSetがこの目的に適したデータ構造ではないと考えています。代わりにHashSetを使用することをお勧めします。ハッシュセットでは、アイテムにhashCode(そのオブジェクトに固有の番号を返すメソッド)とequalsを実装する必要があります。オブジェクトのハッシュコードが等しい場合、2つのオブジェクトも論理的に等しくなります。

あなたは、この実装を支援するためにObjects.hashを利用することができます:

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

代替を、あなたのIDEによって生成された実装の1つを使用します。

@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方法は、あまりにも実装する必要があります。ここに私のIntelliJ IDEAが得たものです。あなたは次のようなことができます:

@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); 

} 
2

まあ、TreeSetでは、要素をソートする必要があります。あなたがセットを構築し、追加しているオブジェクトをどのように並べ替えるかを知っているComparatorか、オブジェクト同士で比較する方法を知る必要があります。 AddressはComparableを実装できますが、なぜTreeSetを使用していますか?あなたのコンストラクタがsuper()への不要な(暗黙的な)呼び出しを行っているので、あなたはJavaに慣れていないと思いますか?たぶんTreeSetのソート機能が必要ないかもしれませんし、HashSet(一意性が必要な場合のみ)で取得することもできます。それにかかわらず、あなたが期待したことをするためには、hashcode()とequals()をオーバーライドする必要があります。 EclipseやIDEAなどのIDEを使用している場合は、おそらくコードテンプレートがあります。

2

基本的には、TreeSetにオブジェクトを保存しています。

ツリーセットはソートされたコレクションです。オブジェクトをTreeSetに格納する場合、オブジェクトはComparableを実装する必要があります。また、ソートする基底オブジェクトの条件を指定する必要があります。ここで

がコードである: -

import java.util.Set; 
import java.util.TreeSet; 

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

    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); 
    } 
} 

class Address implements Comparable{ 
    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; 
    } 

    @Override 
    public int compareTo(Object o) { 
     Address address = (Address)o; 
     return this.type.compareTo(address.type); 
    } 
} 


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"); 
     System.out.println(p1.toString()); 
    } 
} 
関連する問題