在排序树集中存储对象并更新它

时间:2013-09-22 22:40:59

标签: java treeset sortedset

我正在使用树集将一些信号存储为树集中的对象,并且还想要更新对象如果再次出现相同的信号。到目前为止,我尝试了一些东西,但问题是当我尝试打印它时,我无法获得完整的对象。其次,我不知道是否有任何方法可以更新abject并将其保存回设置... 这是我的代码 信号类(Signal.java)

public class Signal implements Comparable<Signal>{

   String source;
   String name;
   int occurance;

   public void setSource(String source){
       this.source = source;
   }

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

   public void setOccurance(int occurance){
       this.occurance = occurance;
   }


   public String getSource(){
       return this.source;
   }

   public String getName(){
       return this.name;
   }

   public int getOccurnace(){
       return this.occurance;
   }

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

我的主要课程

  public class SortedSetTest {

   public static void main(String[] args) {

      // Create the sorted set
      SortedSet<Signal> set = new TreeSet<Signal>();

      //Create a Signal object for each new signal
      Signal sig = new Signal();

      sig.setSource("Source");
      sig.setName("Signal Name");
      sig.setOccurance(1);

      // Add elements to the set
      set.add(sig);
      System.out.println(set); 

以上版本将我显示为对象...如何将该集视为字符串?

      // Iterating over the elements in the set
      Iterator<Signal> it = set.iterator();
      while (it.hasNext()){

我想打印每个对象                例如,取第一个对象并打印对象(信号)源,名称和出现等,直到设置到达为止。
          }        }     }

4 个答案:

答案 0 :(得分:1)

您正确打印该套装。 您还没有实现Signal.toString()方法来按照您希望的方式表示Signal对象。

关于更新TreeSet中的对象:不得修改对象,以免更改compareTo的输出。如果需要以这种方式更新,请将其删除(使用Set.remove(object),更新并重新添加。

也就是说,您的compareTo()方法始终返回0.如果您希望较低的arg0.occurence - occurence值出现在较低值之前,则应返回occurence。 这是因为返回小于0的值意味着this出现在参数之前。 0表示相等的排序,&gt; 1意味着this出现在争论之后。

此外,如果您实现compareTo(),则可以定义类的自然顺序。强烈建议同时覆盖equals()并仅当true返回0时返回compareTo()。请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html(搜索&#39;与等号一致&#39; )。通过compareTo()的上述实现,这意味着仅当true具有相同的occurence值时才返回Comparator<Signal>。如果您不想以这种方式实现equals(可能不正确),那么您应该编写一个实现TreeSet的类并将其传递给{{1}}构造函数。

答案 1 :(得分:1)

您正在寻找的行:

    while (it.hasNext()){
        Signal sig = (Signal)it.next();
        System.out.println(sig.getName());
        System.out.println(sig.getOccurance());
        // do the same with source or whatever property 
    }

答案 2 :(得分:1)

您需要覆盖Signal对象中的toString以获取比Object类中的默认实现更加用户友好的字符串。

另请注意,由于您的所有信号根据compareTo的实施情况而相同(始终返回0),因此您无法在设置中添加多个信号。

答案 3 :(得分:0)

首先你需要覆盖toString方法,而不是使用mutator方法尝试使用实现所有实例变量的构造函数,第三件事是TreeSet使用 红黑树结构,并根据自然顺序保证元素将按升序排列。因此,在compareTo()方法中,您可以比较一个变量以获得解决方案。