2013-07-31 4 views
0

이 프로그램에서는 compartor을 식별하지 않으므로 compareTo을 사용하고 싶지 않습니다.내 프로그램에서 비교기를 사용할 수 없습니다.

class TestTreeSet 
{ 
    public static void main(String args[]) 
    { 
     BuildObject build = new BuildObject(); 
     TreeSet treeSet = new TreeSet(new Compared()); 
     treeSet = build.sendAsTreeSet(); 
     Iterator itr = treeSet.iterator(); 
     while(itr.hasNext()) 
     { 
      Obj object = (Obj) itr.next(); 
      System.out.println(object.getName() + "\n " + object.getAge() + "\n " 
       + object.getSalary()); 
     } 
    } 
} 

이 비교기

class Compared implements Comparator 
{ 
    public int compare(Object a , Object b) 
    { 
     Obj one = (Obj) a; 
     Obj two = (Obj) b; 
     double salaryOne = one.getSalary(); 
     double salaryTwo = two.getSalary(); 
     int ageOne = one.getAge(); 
     int ageTwo = two.getAge(); 
     if(ageOne == ageTwo) 
     { 
      if(salaryOne > salaryTwo) 
      { 
       return -1; 
      } 
      else if(salaryOne < salaryTwo) 
      { 
       return 1; 
      } 
      else return 0; 
     } 
     else if(ageOne > ageTwo) 
     return -1; 
     else return 1; 
    } 
} 

문제가 무엇입니까? 그것은 java.lang.comparable 예외 캐스트 할 수없는 보여줍니다

+2

1.

확인 작업 didnt가 있으면 알려 주시기 바랍니다,'2. 당신은 원시'TreeSet'있는 이유는 무엇입니까? – sanbhat

+0

아직 generics를 배우지 않았기 때문에 원시 트리 집합을 사용하고 있습니다 –

+0

그러면 해당 컬렉션을 사용하여'새 TreeSet'을 만들어야합니다 ..'build.sendAsTreeSet()'의 반환 유형은 무엇입니까? – sanbhat

답변

0

생각의

implements Comparable 

그래서 그냥 documentation에서 올바른 인터페이스

+0

난 여기에 비교할 ... 사용하고 싶지 않아요 내가 비교기를 사용하여 비교기를 사용하려면, 비교기만을 사용하는 프로젝트의 종류 –

+0

오류 메시지 또는 오류에 대한 일부 출력을 보여 주시겠습니까? –

+0

오류는 다음과 같습니다 - 스레드 "main"의 예외 java.lang.ClassCastException : Obj를 java.lang.Comparable에 캐스팅 할 수 없음 –

1

로 변경해야합니다 : 기반

NavigableSet 구현입니다 TreeMap에서. 요소는 자연 순서가 인 으로, 또는 사용되는 생성자에 따라 세트 작성시 제공된 비교 자로 정렬됩니다.

강조 광산.

Comparator을 전달했다고 생각하면 자연 순서가 사용되지 않습니다. 그러나이 줄에서

treeSet = build.sendAsTreeSet(); 

방금 ​​이전 줄에서 작성한 treeSet을 덮어 씁니다. 그 트리 세트는 대개 Comparator 세트가 아닙니다.

  1. 가 (, 당신의 의견에 따라 그 방법에 new TreeSet(new Compared()) 사용) build에 의해 반환되는 TreeSet의이 Comparator 설정이 있는지 확인하십시오 :

    는이 문제를 해결하는 두 가지 방법이 있습니다.

  2. build에 의해 반환 된 트리 집합의 요소가 Comparable을 구현하는지 확인하십시오. sendAsTreeSet 방법 복귀의 Obj 클래스 다음 유형의 개체를 포함하는 TreeSet, 당신은 다음과 같은 ComparedClass을 변경할 수 있습니다
0
BuildObject build = new BuildObject(); 
TreeSet treeSet = new TreeSet(new Compared()); 
treeSet = build.sendAsTreeSet(); 

경우, 나는 그것을 작동 바랍니다. 당신이 당신의 sendAsTreeSet 방법에

TreeSet treeSet = new TreeSet(); 

을 사용하기 때문에

class Compared implements Comparator 
{ 
public int compare(Obj a , Obj b) 
{ 

    double salaryOne = a.getSalary(); 
    double salaryTwo = b.getSalary(); 
    int ageOne = a.getAge(); 
    int ageTwo = b.getAge(); 
    if(ageOne == ageTwo) 
    { 
     if(salaryOne > salaryTwo) 
     { 
      return -1; 
     } 
     else if(salaryOne < salaryTwo) 
     { 
      return 1; 
     } 
     else return 0; 
    } 
    else if(ageOne > ageTwo) 
    return -1; 
    else return 1; 
} 
} 
+0

이것은 작동하지 않습니다. 문제는'sendAsTreeSet()'이 원래'treeSet'을 덮어 쓰므로'Comparator'에 대한 참조가 완전히 없어 졌기 때문입니다. –

+0

여기에'Obj' 객체 목록을 가져 와서'Treeset' 객체에 삽입해야합니다. – Joshi

1

는 TreeSet의이 요소를 정렬하려고 theire natural ordering을 사용하여 추가. 마녀는 Compareable 인터페이스를 구현하는 개체 클래스를 사용하지 않습니다.

당신은

TreeSet treeSet = new TreeSet(new Compared()); 

주요 방법 같은 라인을 제거 할 수와 함께 그 라인을 교체해야합니다.

+0

도움을 주셔서 감사합니다. –

+0

@AkhileshKrishnan 여러분을 환영합니다! – A4L

0

콜렉션 (Treeset)에 콜렉션을 오버라이드하거나 추가 할 때 나중에 콜렉션에 사용되는 비교 기능을 구현할 요소 나 클래스가 필요합니다.

것이다 당신을위한 작업 위

treeSet.addAll(build.sendAsTreeSet()); 

희망 아래로

treeSet = build.sendAsTreeSet(); 

사용 및 addAll에 의해 참조를 할당하는 대신

class Person implements Comparable{ 

    @Override 
    public int compareTo(Object arg0) { 
    return -1; 
    } 
} 

아래로 요소 클래스에 필적 구현하고 시도 . UR은 TreeSet의 = build.sendAsTreeSet()`할당하는 이유는 샘플

아래
public class ComparatorTest { 
    public static void main(String[] args) { 

     TreeSet<Person> treeSet = new TreeSet<Person>(new Comparator()); 
     treeSet.addAll(new BuildObject().sendAsTreeSet()); 
     Iterator<Person> itr = treeSet.iterator(); 
     while(itr.hasNext()) 
     { 
      Person itrObject = itr.next(); 
      System.out.println("Name: "+itrObject.getName()+"\n Age: "+itrObject.getAge() + "\n Salary: " + itrObject.getSalary()); 
     } 
    } 
} 

class Comparator implements java.util.Comparator<Person> { 
    @Override 
    public int compare(Person one, Person two) { 
     double salaryOne = one.getSalary(); 
     double salaryTwo = two.getSalary(); 
     int ageOne = one.getAge(); 
     int ageTwo = two.getAge(); 
     if (ageOne == ageTwo) { 
      if (salaryOne > salaryTwo) { 
       return -1; 
      } else if (salaryOne < salaryTwo) { 
       return 1; 
      } else 
       return 0; 
     } else if (ageOne > ageTwo) 
      return -1; 
     else 
      return 1; 
    } 
} 

class BuildObject{ 
    public TreeSet<Person> sendAsTreeSet(){ 
     Person object = new Person(); 
     object.setName("Pritesh"); 
     object.setAge(20); 
     object.setSalary(1000); 

     Person object2 = new Person(); 
     object2.setName("Joe"); 
     object2.setAge(19); 
     object2.setSalary(3000); 

     Person object3 = new Person(); 
     object3.setName("Blogg"); 
     object3.setAge(20); 
     object3.setSalary(4000); 

     TreeSet<Person> treeSet = new TreeSet<Person>(); 
     treeSet.add(object); 
     treeSet.add(object2); 
     treeSet.add(object3); 
     return treeSet; 
    } 
} 

class Person implements Comparable{ 
    private String name; 
    private int age; 
    private int salary; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

    public int getSalary() { 
     return salary; 
    } 

    public void setSalary(int salary) { 
     this.salary = salary; 
    } 

    @Override 
    public int compareTo(Object arg0) { 
     return -1; 
    } 
} 
+0

첫 번째 진술이 잘못되었습니다. TreeSet 내에서 Comparator를 사용하는 경우, 요소가 자연 순서 부를 가질 필요는 없습니다. – ARRG