2014-02-28 2 views
1

나는 Java Collections를 처음 사용합니다. MyData, Initializer 및 SetBasics의 세 클래스가 있습니다.TreeSet는 하나의 값만 추가합니까?

HashSet 및 TreeSet을 만들었습니다. 이제 문제는 HashSet이 잘 작동하지만 TreeSet은 하나의 값만 저장하는 것입니다. 여기

클래스의 MyData

`패키지 collectionsWorkUp.setDemos 내 클래스이다;

공용 클래스의 MyData에 Comparable {

MyData(){ 
} 

MyData(String n, String p, String eM, long mn, char s){ 
    name = n; 
    profession = p; 
    email = eM; 
    mobileNo = mn; 
    sex = s; 
} 


private String name; 
private String profession; 
private String email; 
private long mobileNo; 
private char sex; 


public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public String getProfession() { 
    return profession; 
} 
public void setProfession(String profession) { 
    this.profession = profession; 
} 
public String getEmail() { 
    return email; 
} 
public void setEmail(String email) { 
    this.email = email; 
} 
public long getMobileNo() { 
    return mobileNo; 
} 
public void setMobileNo(long mobileNo) { 
    this.mobileNo = mobileNo; 
} 
public char getSex() { 
    return sex; 
} 
public void setSex(char sex) { 
    this.sex = sex; 
} 

@Override 
public int compareTo(MyData o) { 
    // TODO Auto-generated method stub 
    return 0; 
} 

} `

클래스 이니셜에게

패키지 collectionsWorkUp.setDemos을 구현;

공용 클래스 이니셜 {

/** 
* @param args 
*/ 
public static void main(String[] args) { 

    System.out.println("Initializing"); 

    SetBasics operate = new SetBasics(); 

    operate.DataInSet(); 
    operate.printDataInSet(operate.getUsersInHash()); 

    System.out.println("\n\nPrinting Data in Tree Set--------------------"); 
    operate.printDataInSet(operate.getUsersInTree()); 

    System.out.println("\n\n--------Program Terminated----------"); 

} 

}

클래스 SetBasics

패키지 collectionsWorkUp.setDemos;

import java.util.HashSet; import java.util.Set; 가져 오기 java.util.TreeSet;

공용 클래스 SetBasics {

private Set<MyData> usersInHash = new HashSet<MyData>(); 
    private Set<MyData> usersInTree = new TreeSet<MyData>(); 

    MyData d1= new MyData(d1's data -data include name, #, profession etc check MyData Class); 
    MyData d2= new MyData(d2's data); 
    MyData d3= new MyData(d3's data); 
    MyData d4= new MyData(d4's data); 
    MyData d5= new MyData(d5's data); 
    MyData d6= new MyData(d6's data); 
    MyData d7= new MyData(d7's data); 
    MyData nullUser = null; 

    public Set<MyData> getUsersInHash() { 
     return usersInHash; 
    } 

    public Set<MyData> getUsersInTree() { 
     return usersInTree; 
    } 

public SetBasics(){ } 

public void DataInSet(){ 

    { 
     System.out.println("Adding Data in HashSet"); 
     System.out.println("Data in HashSet Before Adding Element:" + usersInHash.size()); 
     setDataInSet(nullUser); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
     setDataInSet(d7); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
     setDataInSet(d6); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
     setDataInSet(d5); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
     setDataInSet(d4); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
     setDataInSet(d3); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
     setDataInSet(d2); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
     setDataInSet(d1); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
     setDataInSet(null); 
     System.out.println("Data in HashSet After Adding Element:" + usersInHash.size()); 
    } 

    { 
     System.out.println("Adding Data in TreeSet"); 
     System.out.println("Users in Tree after Before Data:"+usersInTree.size()); 
     setDataInTreeSet(d7); 
     System.out.println("Users in Tree after Adding Data:"+usersInTree.size()); 
     setDataInTreeSet(d6); 
     System.out.println("Users in Tree after Adding Data:"+usersInTree.size()); 
     setDataInTreeSet(d5); 
     System.out.println("Users in Tree after Adding Data:"+usersInTree.size()); 
     setDataInTreeSet(d4); 
     System.out.println("Users in Tree after Adding Data:"+usersInTree.size()); 
     setDataInTreeSet(d3); 
     System.out.println("Users in Tree after Adding Data:"+usersInTree.size()); 
     setDataInTreeSet(d2); 
     System.out.println("Users in Tree after Adding Data:"+usersInTree.size()); 
     setDataInTreeSet(d1); 
     System.out.println("Users in Tree after Adding Data:"+usersInTree.size()); 

     printDataInSet(usersInTree); 
    } 

} 

public void setDataInSet(MyData userDetails){ 
    System.out.println("Setting Data in HashSet"); 
    usersInHash.add(userDetails);  
} 

public void setDataInTreeSet(MyData userDetails){ 
    System.out.println("Setting Data in TreeSet"); 
    usersInTree.add(userDetails); 
} 

public void printDataInSet(Set<MyData> s){ 
    System.out.println("Printing Data"); 
    System.out.println("Size of the Set:"+s.size()); 
    for(MyData itorator: s){ 
     try{ 
      System.out.println("User Details:______"); 
      System.out.println("Name:"+itorator.getName()); 
      System.out.println("Mobile Number:"+itorator.getMobileNo()); 
      System.out.println("eMail:"+itorator.getEmail()); 
      System.out.println("Profession:"+itorator.getProfession()); 
      System.out.println("Sex:"+itorator.getSex()); 

     }catch(NullPointerException npe){ 
      System.out.println(npe.getMessage()); 
      npe.getStackTrace(); 
     }finally{ 
      System.out.println("EOD_____\n"); 
     } 

    } 

} 

}

이제 문제는 TreeSet의에서 난 단지에만 D7 및 다른 아무것도의 데이터를 볼 수있다는 TreeSet의

+0

의 중복 가능성 [왜 TreeSet의 첫 번째 요소를 넘어 아무것도 추가하지 않습니다?] (http://stackoverflow.com/questions/22123336/why-does-my-treeset-not-add-anything- 너머 첫 번째 요소) – Raedwald

답변

4

받는 추가지고 TreeSetMyData.compareTo 구현을 사용하여 요소를 비교합니다. 하지만 구현하지 않았습니다. 항상 0을 반환합니다. 따라서 TreeSet에서 알 수있는 것처럼 모든 MyData 개체는 같습니다. 자세한 내용은 compareTo javadoc을 참조하십시오.

hashCodeequals을 사용하기 때문에 HashSet이 작동합니다. compareTo과 달리 이것들은 참조 동등성을 기반으로하는 Object 클래스의 기본 구현을가집니다. 이 두 가지 방법을 무시하고 대신 MyData 필드에 배치하는 것이 좋습니다. 마찬가지로 동일한 데이터를 가진 두 개의 서로 다른 객체가 동일한 것으로 간주되지 않습니다. (대부분의 IDE는 지정된 필드를 기반으로 hashCodeequals 우선 좋은 자동으로 생성 할 수 있습니다.)

+0

고마워 폴, 내가 그것을 통해 가서 제안하자 :) –

+0

안녕하세요 폴은 도움을 주셔서 감사합니다 :) +1 –

2

문제는 compareTo 메소드에입니다. return 0 treat는 MyData이며, TreeSetMyData 개체가 하나 추가됩니다.

public int compareTo(MyData o) { 
    //Write correct compareTo contract for MyData. 
} 
+0

안녕 Masud, 도와 줘서 고마워 +1 –

관련 문제