0

我正在使用树集将一些信号作为对象存储在我的树集中,并且如果再次出现相同的信号,我还想更新对象。到目前为止,我尝试了一些东西,但问题是当我尝试打印它时我无法获得完整的对象,其次我不知道是否有任何方法可以更新 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

4 回答 4

1

您正在正确打印该集合。您只是没有实现以您想要的方式Signal.toString()表示Signal对象的方法。

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

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

此外,如果您实现,则compareTo()定义类的自然顺序。强烈建议当且仅当返回 0时也覆盖equals()和返回。请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html(搜索“与等于一致” )。使用上面的实现,这意味着只有当它们都具有相同的值时才返回。如果您不想以这种方式实现equals(可能不正确),那么您应该编写一个实现并将其传递给构造函数的类。truecompareTo()compareTo()trueoccurenceComparator<Signal>TreeSet

于 2013-09-22T22:46:58.533 回答
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 
    }
于 2013-09-22T22:52:31.240 回答
1

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

另请注意,由于根据您的实现compareTo(始终返回 0),您的所有信号都是相等的,因此您将无法将多个信号添加到您的集合中。

于 2013-09-22T22:55:52.377 回答
0

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

于 2013-09-23T00:02:11.720 回答