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