假设我需要创建一个多集数据结构,其中包含两个集合的交集和并集。使用c#或java。
在这两种情况下,我都需要创建两个集合中每个对象的副本,否则更改其中一个集合可能会破坏其他集合。
我看到一个解决方案:指定泛型类型,例如
class MultiSet<T, U> where T : struct, where U : ICloneable
或类似的东西在java。
还有其他方法可以解决这个问题吗?
答案 0 :(得分:3)
在这两种情况下,我都需要创建两个集合中每个对象的副本,否则更改其中一个集合可能会破坏其他集合
如果你想要两个对象集合的交叉,你需要引用那些&#34;匹配&#34;结果,而不是他们的副本。后者毫无意义。
要检查两个对象是否相同(在第1组和第2组中),只需以有意义的方式比较它们(即覆盖它们的哈希码和比较方法)。
结果集合的结构也将取决于对象是否相等而没有它们的引用相等。在这种情况下,生成的集合需要保存两个引用(每个引用两个&#34;匹配&#34;),每个引用一个。
至于union,只需创建一个集合,该集合包含对两个集合中所有对象的引用。
Union和intersect是数据操作,所以我假设你的集合将保存数据。在编程语言中进行此类操作并不是最好的主意。还有其他工具可以完成任务,例如SQL。
答案 1 :(得分:1)
除推荐的ICloneable外? (我说推荐的方式,但克隆通常被认为是坏的)
我想如果对象是Serializable,你可以序列化和反序列化为一个新对象。
var formatter = new BinaryFormatter();
var stream = new MemoryStream();
using (stream)
{
formatter.Serialize(stream, yourObject);
stream.Seek(0, SeekOrigin.Begin);
return (YourObjectType)formatter.Deserialize(stream);
}
添加一个空检查,它将为可序列化对象提供一个很好的扩展方法。
再一次,克隆可能不是解决您问题的好方法,但我对您的用例的了解不足以推荐任何内容。