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

Java 在排序树集中存储对象并更新它,java,treeset,sortedset,Java,Treeset,Sortedset,我正在使用一个树集将一些信号存储为树集中的对象,如果相同的信号再次出现,我还想更新一个对象。到目前为止,我尝试了一些东西,但问题是,当我试图打印它时,我无法获得完整的对象,其次,我不知道是否有任何方法更新一个abject并将其保存回集合。。。 这是我的密码 信号类(Signal.java) 公共类信号实现可比性{ 字符串源; 字符串名; 内隐发生; 公共void集合源(字符串源){ this.source=源; } 公共void集合名(字符串名){ this.name=名称; } 公共无效集合发

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

公共类信号实现可比性{
字符串源;
字符串名;
内隐发生;
公共void集合源(字符串源){
this.source=源;
}
公共void集合名(字符串名){
this.name=名称;
}
公共无效集合发生率(整数发生率){
this.occurance=发生;
}
公共字符串getSource(){
返回此.source;
}
公共字符串getName(){
返回此.name;
}
public int getoccurance(){
返回此事件;
}
@凌驾
公共整数比较(信号arg0){
//TODO自动生成的方法存根
返回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); 
公共类分类测试{
公共静态void main(字符串[]args){
//创建排序集
SortedSet集合=新树集合();
//为每个新信号创建一个信号对象
信号sig=新信号();
信号源(“源”);
信号集名(“信号名”);
信号发生(1);
//向集合中添加元素
设置。添加(sig);
系统输出打印项次(套);
上面的打印将我显示为对象…我如何将集合视为字符串?

      // Iterating over the elements in the set
      Iterator<Signal> it = set.iterator();
      while (it.hasNext()){
//迭代集合中的元素
Iterator it=set.Iterator();
while(it.hasNext()){
这里我要打印每个对象 例如,以第一个对象为例,打印对象(信号)源、名称和发生情况等,直到集合结束。
} }
}

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

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

也就是说,你的
compareTo()
方法总是返回0。如果你想让较高的
occurrence
值在较低的值之前出现,它应该返回
arg0.occurrence-occurrence
。 这是因为返回小于0的值意味着
位于参数之前。0意味着顺序相等,>1意味着
位于参数之后


此外,如果实现
compareTo()
则定义类的自然顺序。强烈建议也重写
equals()
并返回
true
当且仅当
compareTo()
返回0时。请参阅(搜索“与equals一致”)。使用上述
compareTo()实现
,这意味着仅当它们都具有相同的
发生次数
值时才返回
true
。如果不想以这种方式实现equals(可能不正确)然后您应该编写一个实现
Comparator
的类,并将其传递给
TreeSet
构造函数。

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

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

也就是说,你的
compareTo()
方法总是返回0。如果你想让较高的
occurrence
值在较低的值之前出现,它应该返回
arg0.occurrence-occurrence
。 这是因为返回小于0的值意味着
位于参数之前。0意味着顺序相等,>1意味着
位于参数之后


此外,如果实现
compareTo()
则定义类的自然顺序。强烈建议也重写
equals()
并返回
true
当且仅当
compareTo()
返回0时。请参阅(搜索“与equals一致”)。使用上述
compareTo()实现
,这意味着仅当它们都具有相同的
发生次数
值时才返回
true
。如果不想以这种方式实现equals(可能不正确)然后,您应该编写一个实现
Comparator
的类,并将其传递给
TreeSet
构造函数。

您要查找的行:

    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 
    }

您要查找的行:

    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 
    }

您需要重写Signal对象中的
toString
,以获得一个比object类中的默认实现更为用户友好的字符串


还要注意的是,由于基于
compareTo
的实现,所有信号都是相等的(始终返回0)您将无法向集合中添加多个信号。

您需要覆盖Signal对象中的
toString
,以获得比object类中的默认实现更友好的字符串


还要注意的是,由于基于
compareTo
的实现,所有信号都是相等的(始终返回0)您将无法向集合中添加多个信号。

首先,您需要重写toString方法,而不是使用mutator方法尝试使用实现所有实例变量的构造函数,第三件事是TreeSet使用 红黑树结构,并保证元素