2011-12-08 47 views
2

我的应用程序中有3个不同的TreeSet对象,所有这些对象都存储相同类的对象。向Java Collection添加其他逻辑

但是,在任何一个时间点,一个对象可能只存在于TreeSet中的一个中。因此,如果我查询每个TreeSet使用contains()为一个特定的对象,它应该只存在于其中的一个。

有没有简单的方法可以轻松地将这种逻辑添加到我的TreeSet中?很明显,我可以执行上面的contains()检查每个操作后自己,但只是想知道是否有更好的方法?

谢谢

回答

8

您可以保留一个映射,将对象映射到它们当前所属的TreeSet。如果一个对象没有条目,它可以被添加到TreeSet;否则必须在映射的TreeSet被分配给新的映射之前将其从映射的TreeSet中移除。

编辑:

按照您的要求,下面是如何这可能完成的代码片段:

Map<MyObject, TreeSet<MyObject>> map = new HashMap<MyObject, TreeSet<MyObject>>(); 

void addToSet(MyObject obj, TreeSet<MyObject> set) { 
    TreeSet<MyObject> otherSet = map.get(obj); 
    if (otherSet != null) { 
     otherSet.remove(obj); 
    } 
    set.add(obj); 
    map.put(obj, set); 
} 

void removeFromSet(MyObject obj, TreeSet<MyObject> set) { 
    set.remove(obj); 
    map.remove(obj); 
} 
+0

不知道我跟着,你有没有一小段代码片段或算法供参考? – DJ180

+0

@DavidJoyce - 看我的编辑。 –

0

也许是这样的:

import java.util.*; 
class Sets { 
    Sets(TreeSet<Integer> set1, TreeSet<Integer> set2, TreeSet<Integer> set3) { 
     this.set1 = set1; 
     this.set2 = set2; 
     this.set3 = set3; 
    } 
    boolean add(TreeSet<Integer> set, Integer i) { 
     if (set == set1) { 
      if (set2.contains(i)) { 
       set2.remove(i); 
       return set.add(i); 
      } else if (set3.contains(i)) { 
       set3.remove(i); 
       return set.add(i); 
      } else return set.add(i); 
     } 
     else if (set == set2) { 
      if (set1.contains(i)) { 
       set1.remove(i); 
       return set.add(i); 
      } else if (set3.contains(i)) { 
       set3.remove(i); 
       return set.add(i); 
      } else return set.add(i); 
     } 
     else if (set == set3) { 
      if (set1.contains(i)) { 
       set1.remove(i); 
       return set.add(i); 
      } else if (set2.contains(i)) { 
       set2.remove(i); 
       return set.add(i); 
      } else return set.add(i); 
     } 
     return false; 
    } 
    final TreeSet<Integer> set1, set2, set3; 
} 
public class Main { 
    public static void main(String[] args) { 
     TreeSet<Integer> set1 = new TreeSet<Integer>(); 
     set1.add(1); 
     TreeSet<Integer> set2 = new TreeSet<Integer>(); 
     set2.add(2); 
     TreeSet<Integer> set3 = new TreeSet<Integer>(); 
     Sets sets = new Sets(set1, set2, set3); 
     System.out.println(set1); 
     System.out.println(set2); 
     System.out.println(set3); 
     sets.add(set3,1); 
     sets.add(set3,2); 
     sets.add(set3,3); 
     System.out.println(set1); 
     System.out.println(set2); 
     System.out.println(set3); 
    } 
}