问题
I am trying to write a procedure do the deep copy of List<List<Integer>>
, and I am doing like this:
public static List<List<Integer>> clone(final List<List<Integer>> src)
{
List<List<Integer>> dest = new ArrayList<List<Integer>>();
for( List<Integer> sublist : src) {
List<Integer> temp = new ArrayList<Integer>();
for(Integer val: sublist) {
temp.add(val);
}
dest.add(temp);
}
return dest ;
}
Is this a good way to do? Is it possible to get rid of the inner loop? The fact is that each of the inner sub-lists can grow to large lengths.
回答1:
Is this a good way to do?
It's fine.
Is it possible to get rid of the inner loop?
Yes, you can use the ArrayList
copy constructor:
for( List<Integer> sublist : src) {
dest.add(new ArrayList<>(sublist));
}
The fact is that each of the inner sub-lists can grow to large lengths.
The above will shorten the code, and it delegates to System.arraycopy
, which will likely improve performance somewhat. It also avoids the repeated resize/copy when you fill an empty ArrayList
. But there's fundamentally no way to avoid the O(n) time complexity of copying a list/array, if you truly need a deep copy. Since you don't explain why you need a deep copy, I'll have to take you at your word.
回答2:
You might be able to speed things up with some parallel approach, like using a Thread pool to split the work at first and merge the results together after everything is done.
I can't provide an example since I'm on my phone, but may try to look that way.
回答3:
Try this.
public static <T> List<List<T>> clone(final List<List<T>> src) {
return src.stream()
.map(list -> list.stream().collect(Collectors.toList()))
.collect(Collectors.toList());
}
来源:https://stackoverflow.com/questions/44640648/java-best-way-to-do-deep-copy-of-list-of-lists