2017-10-12 10 views
2

기본적으로 각 Person 객체에 대해 여러 주소를 저장하려고합니다. 필자는 Person 클래스의 TreeSet에 Address 객체를 저장하여이를 달성하기로 결정했습니다. 본질적으로 나는 TreeSet에 생성 한 각 Address 객체의 toString()을 저장하려고합니다. 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"); 
    } 
} 

오류 메시지입니다 ... 지정된 행에 오류가 발생 나중에 각 속성을 개별적으로 조작 할 수 있기를 원하기 때문입니다. 또한 각 Person 객체에 대해 여러 주소를 저장할 수 있도록 주소 클래스의 여러 반복이 필요하므로 Person 클래스에 Address 클래스 속성을 저장하지 않으려합니다.

답변

2

문제는하는 TreeSet의에 무언가를 넣어, 그들은 비교해야한다. 이는 트리 집합이 항목을 트리 구조로 정렬하려고하기 때문입니다. 예외가 throw 될 수없는 경우 Tree 세트에 넣는 모든 내용은 Comparable을 구현해야합니다.

그러나 주소를 논리적으로 비교할 수는 없습니까? 주소에 대해 compareTo 메소드를 작성하는 것은 매우 어렵습니다. 주소가 다른 주소보다 "큰지"를 어떻게 결정합니까?

따라서 TreeSet은이 목적에 적합한 데이터 구조가 아닙니다. 대신 HashSet을 사용하시기 바랍니다. 해시 세트는 항목에 hashCode (해당 개체에 고유 한 번호를 반환하는 메서드) 및 equals을 구현해야합니다. 객체의 해시 코드가 동일하면 두 객체가 논리적으로 동일합니다.

당신은 당신이 이것을 구현하기 위해 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); 

} 
2

음, TreeSet은 요소를 정렬해야합니다. 어느 것이 든 세트를 구성하고 추가하고있는 오브젝트를 정렬하는 방법을 알고있는 Comparator를 주거나 오브젝트 자체가 서로 비교하는 방법을 알아야합니다. Address가 Comparable을 구현할 수는 있지만 왜 TreeSet을 사용하고 있습니까? 생성자가 불필요한 (암시 적이기 때문에) super()를 호출하기 때문에, Java에 익숙하지 않은 것 같군요? 어쩌면 TreeSet의 정렬 기능이 필요 없으며 독창성이 필요한 경우 HashSet을 사용할 수 있습니다. 그럼에도 불구하고 세트가 원하는 것을 수행하기 원하면 hashcode() 및 equals()를 재정의해야합니다. 이클립스 나 IDEA 같은 IDE를 사용한다면 아마 도움이되는 코드 템플릿이있을 것이다.

2

기본적으로 TreeSet에 개체를 저장하려고합니다.

Treeset은 Sorted Collection입니다. TreeSet에 개체를 저장하는 경우 Object는 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()); 
    } 
}