2013-10-18 61 views

回答

1

你的对象必须是实现了接口可比

​​

或使我们自己的比较:

class MyClass {} 

class MyComparator implements Comparator { 
    int compareTo(Object o1, Object o2){ 
     ... 
    } 
} 
final Set set = new TreeSet(new MyComparator()); 
set.add(new MyClass()); 
.... 
set.add(new MyClass()); 
1

你要确保你添加到TreeSet的对象实现Comparable。这意味着确保所存储的对象实现如在Javadoc限定的compareTo方法。

你也许并不需要一个Comparator

顺便说一句,我们最近就正是这个主题创建tutorial。希望它可以帮助你。

1

对于TreeSet,你需要给自己实现Comparator接口。

这样的事情,也许呢?

// Using an anonymous interface 
Set<Foobar> example = new TreeSet<Foobar>(new Comparator<Foobar>() { 
    @Override 
    public int compare(Foobar f1, Foobar f2) { 
    // How will you compare f1 and f2?? 
    return 0; 
    } 

    @Override 
    public boolean equals(Object obj) { 
    // How will you determine if objects are equal? 
    return false; 
    } 
} 
); 
1

请参考下面的代码

package com.example.treeset; 

    import java.util.Comparator; 
    import java.util.TreeSet; 

    public class MyCompUser { 

     public static void main(String a[]){ 
      //By using name comparator (String comparison) 
      TreeSet<Empl> nameComp = new TreeSet<Empl>(new MyNameComp()); 
      nameComp.add(new Empl("Ram",3000)); 
      nameComp.add(new Empl("John",6000)); 
      nameComp.add(new Empl("Crish",2000)); 
      nameComp.add(new Empl("Tom",2400)); 
      for(Empl e:nameComp){ 
       System.out.println(e); 
      } 
      System.out.println("==========================="); 
      //By using salary comparator (int comparison) 
      TreeSet<Empl> salComp = new TreeSet<Empl>(new MySalaryComp()); 
      salComp.add(new Empl("Ram",3000)); 
      salComp.add(new Empl("John",6000)); 
      salComp.add(new Empl("Crish",2000)); 
      salComp.add(new Empl("Tom",2400)); 
      for(Empl e:salComp){ 
       System.out.println(e); 
      } 
     } 
    } 

    class MyNameComp implements Comparator<Empl>{ 

     @Override 
     public int compare(Empl e1, Empl e2) { 
      return e1.getName().compareTo(e2.getName()); 
     } 
    } 

    class MySalaryComp implements Comparator<Empl>{ 

     @Override 
     public int compare(Empl e1, Empl e2) { 
      if(e1.getSalary() > e2.getSalary()){ 
       return 1; 
      } else { 
       return -1; 
      } 
     } 
    } 

    class Empl{ 

     private String name; 
     private int salary; 

     public Empl(String n, int s){ 
      this.name = n; 
      this.salary = s; 
     } 

     public String getName() { 
      return name; 
     } 
     public void setName(String name) { 
      this.name = name; 
     } 
     public int getSalary() { 
      return salary; 
     } 
     public void setSalary(int salary) { 
      this.salary = salary; 
     } 
     public String toString(){ 
      return "Name: "+this.name+"-- Salary: "+this.salary; 
     } 
    }