删除一个Object并在TreeSet中添加另一个

时间:2013-09-23 14:53:32

标签: java list object treeset sortedset

我正在使用Java中的Tree Set来添加集合中的一些对象。每个对象都是具有不同属性的信号。每次有新信号出现时,我都会设置一些物体属性(信号)并将其添加到设备中,信号可以多出一次。对于信号我保留一个列表,其中我存储信号名称,当我发出信号时,我检查信号是否在列表中如果它不在列表中我只是添加一个新对象到我的集合但如果信号是在列表中,我从集合中获取该信号并修改其某些属性,删除信号并添加新信号。

问题在于,当我发出信号第二次或第三次等等时,它不会移除旧信号,并保持同一信号的所有出现都具有修改的属性。

这是我的代码

 SortedSet<Signal> set = new TreeSet<Signal>();

 ArrayList< String > messages = new ArrayList< String >();

   //If the Message is new one              
            if(!messages.contains(messageName)){
                //System.out.println("I am new signal");
                //Add the new Message in Message List 
                messages.add(messageName);

                //Create Object of Message to be stored in Set
                signal = new Signal();
                signal.setSource(messageSource);
                signal.setName(messageName);
                if(messageSource.equals("egdci") || messageSource.equals("ugdci"))
                    signal.setComponent(egdci_ugdci_msgComponent);
                else
                    signal.setComponent(messageComponent);
                signal.setOccurance(messageCounter);
                signal.setSize(messageContent.length);
                signal.setBandwidth(0F);

                //Add the new Message Object in the Set  
                set.add(signal);
            }            
            //If Message already exists in the list
            else{
                //System.out.println("I am old one");
                Iterator<Signal> iterator = set.iterator();
                while(iterator.hasNext()) {
                    signal = (Signal)iterator.next();
                    if(signal.getName().equalsIgnoreCase(messageName)){
                        System.out.println("I am here");
                        int occurance  = signal.getOccurance() + 1;
                        int size = occurance * messageContent.length;
                        float bandwidth  = 0F;                          
                        set.remove(signal);

                        signal = new Signal();
                        signal.setSource(messageSource);
                        signal.setName(messageName);
                        if(messageSource.equals("egdci") || messageSource.equals("ugdci"))
                            signal.setComponent(egdci_ugdci_msgComponent);
                        else
                            signal.setComponent(messageComponent);
                        signal.setOccurance(occurance);
                        signal.setSize(size);
                        signal.setBandwidth(bandwidth);

                        //Add the new Message Object in the Set  
                        set.add(signal);
                    }                           
                }
            }

     writeToCSV(signal , writer);

此外,我尝试根据信号的出现在文件中对信号进行排序,出现的值越高,顶部应该在文件中。

这是我在Signal.java中的compareTo代码(我第一次使用树集,所以不确定如何实现我的comapreTo)

    @Override
   public int compareTo(Signal signal) {
       int thisOccurance = this.getOccurance();
       return thisOccurance.compareTo(signal.getOccurance());
   }  

任何帮助都将受到高度赞赏......

提前致谢

1 个答案:

答案 0 :(得分:1)

如果问题只是删除旧信号,您可以使用以下方法将其删除:

iterator.remove();

一旦结束,您可以创建,然后将新信号添加到集合中。

你的条件应该是这样的:

    else {
        // System.out.println("I am old one");
        final Iterator<Signal> iterator = set.iterator();
        boolean deleted = false;
        while (iterator.hasNext()) {
            signal = (Signal)iterator.next();
            if(signal.getName().equalsIgnoreCase(messageName)){
                iterator.remove();
                deleted = true;
                break;
            }
        }
        if(delted){
            int occurance  = signal.getOccurance() + 1;
            int size = occurance * messageContent.length;
            float bandwidth  = 0F;              

            signal = new Signal();
            signal.setSource(messageSource);
            signal.setName(messageName);
            if(messageSource.equals("egdci") || messageSource.equals("ugdci"))
                signal.setComponent(egdci_ugdci_msgComponent);
            else
                signal.setComponent(messageComponent);
            signal.setOccurance(occurance);
            signal.setSize(size);
            signal.setBandwidth(bandwidth);

            //Add the new Message Object in the Set  
            set.add(signal);
        }
    }