Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何整齐地深度克隆哈希集?_Java_Cloning - Fatal编程技术网

Java:如何整齐地深度克隆哈希集?

Java:如何整齐地深度克隆哈希集?,java,cloning,Java,Cloning,我有一个需要克隆的MyObject散列集。如果MyObject实现了复制构造函数,那么克隆设置MyObject 显然,我可以这样做: Set<MyObject> myNewObjects = new Set<MyObject>(); for(MyObject obj: myObjects) myNewObjects.add(new MyObject(obj)); Set myNewObjects=newset(); 对于(MyObject对象:myObjects)

我有一个需要克隆的
MyObject
散列集。如果
MyObject
实现了复制构造函数,那么克隆
设置MyObject

显然,我可以这样做:

 Set<MyObject> myNewObjects = new Set<MyObject>(); 
 for(MyObject obj: myObjects) myNewObjects.add(new MyObject(obj));
Set myNewObjects=newset();
对于(MyObject对象:myObjects)myNewObjects.add(newmyobject(obj));
但我是作为Looong copy Constructor的一部分来做这件事的,我真的很想用一行代码来完成它,比如:

public myClass(MyClass toClone){
    //... 
    this.myObjects = new Set<MyObjects>(toClone.getmyObjects()); 
    //... 
}
公共myClass(myClass目录){
//... 
this.myObjects=新集合(toClone.getmyObjects());
//... 
}

有什么建议吗

你可以用谷歌番石榴做这样的事情:

Set<MyObject> newSet = new HashSet<MyObject>(
  Iterables.transform(myObjects,new Function<MyObject, MyObject>() {
    @Override
    public MyObject apply(MyObject input) {
      return new MyObject(input);
    }
  }));
Set<MyObject> set1 = new HashSet<>();
Set<MyObject> set2 = set1.stream().map(MyObject::new).collect(Collectors.toSet());
Set newSet=newhashset(
变换(MyObject,新函数(){
@凌驾
公共MyObject应用(MyObject输入){
返回新的MyObject(输入);
}
}));
或者,如果您希望它不可变,请使用:

Set newSet=ImmutableSet.copyOf(
变换(MyObject,新函数(){
@凌驾
公共MyObject应用(MyObject输入){
返回新的MyObject(输入);
}
}));

不幸的是,除非您可以使用Java 8,否则它不会比您现有的更紧凑。

如果您使用Java 8,您可以执行以下操作:

Set<MyObject> newSet = new HashSet<MyObject>(
  Iterables.transform(myObjects,new Function<MyObject, MyObject>() {
    @Override
    public MyObject apply(MyObject input) {
      return new MyObject(input);
    }
  }));
Set<MyObject> set1 = new HashSet<>();
Set<MyObject> set2 = set1.stream().map(MyObject::new).collect(Collectors.toSet());
Set set1=new HashSet();
Set set2=set1.stream().map(MyObject::new).collect(Collectors.toSet());
但是,请记住,使用:

对于返回的集合的类型、可变性、序列化性或线程安全性没有任何保证

尽管Java 8 Update 5中的当前实现使用常规HashSet。

Set Set=new HashSet();
Set<MyObject> set = new HashSet<>();
        for (MyObject value : myHash) {
            set.add(value.copy());
        }
for(MyObject值:myHash){ set.add(value.copy()); }

value.copy()
是克隆对象的函数(你需要创建一个这样的方法,创建一个新对象,并相应地分配字段,以便进行深度克隆。)。

还有一个可以使用的可克隆界面。嗨,大卫,我遇到的每一篇文章都强烈警告我不要使用clone(),因为它的实现本身就被破坏了。。。您是否不同意,或者这只是供参考?您可以随时覆盖克隆,但是的,它在默认情况下有点崩溃。在Java中没有完全通用的方法来深度克隆任何内容。您必须直接使用MyObject的构造函数。@Paul要求一个深度副本。嗨,Giovanni,我觉得HashSet副本构造函数会给我一个浅副本?我的意思是,它不会调用集合中每个元素的副本构造函数吗?@Paul我不知道你实际上在创建新实例,抱歉。我会编辑。@Paul请看一下编辑,再次为误读道歉!谢谢你的帮助!:)Java 6遗留系统:(