Dada una lista en Java , la tarea es clonar esta lista.
Ejemplo:
Entrada: list = [“Geeks”, “for”, “Geeks”]
Salida: clonedList = [“Geeks”, “for”, “Geeks”]Entrada: list = [“GeeksForGeeks”, “A Computer Science”, “Portal”]
Salida: clonedList = [“GeeksForGeeks”, “A Computer Science”, “Portal”]
En Java, existen varios métodos para clonar una lista. Este artículo explicará algunos de los principales métodos utilizados para lograr lo mismo.
- Uso de un constructor de copia: al usar el constructor ArrayList en Java, se puede inicializar una nueva lista con los elementos de otra colección.
Sintaxis:ArrayList cloned = new ArrayList(collection c); where c is the collection containing elements to be added to this list.
Acercarse:
- Cree una lista para ser clonada.
- Clone la lista pasando la lista original como parámetro del constructor de copia de ArrayList.
El siguiente código ilustra este ejemplo.
// Program to clone a List in Java
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
class
Example {
public
static
void
main(String[] args)
{
// Create a list
List<String> original
= Arrays.asList(
"GeeksForGeeks"
,
"A Computer Science"
,
"Portal"
);
// Clone the list
List<String> cloned_list
=
new
ArrayList<String>(original);
System.out.println(cloned_list);
}
}
Producción:[GeeksForGeeks, A Computer Science, Portal]
- Usando el método addAll(): La clase List tiene un método llamado addAll(), que agrega todos los elementos de una colección a la lista.
Sintaxis:
boolean addAll(Collection c); where c is the collection containing elements to be added to this list.
Acercarse:
- Cree una lista para ser clonada.
- Cree una lista vacía usando el constructor ArrayList.
- Agregue la lista original a la lista vacía usando el método addAll().
El siguiente ejemplo ilustrará este método.
// Program to clone a List in Java
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
class
Example {
public
static
void
main(String[] args)
{
// Create a list
List<String> original
= Arrays.asList(
"GeeksForGeeks"
,
"A Computer Science"
,
"Portal"
);
List<String> cloned_list
=
new
ArrayList<String>();
// Cloning a list
cloned_list.addAll(original);
System.out.println(cloned_list);
}
}
Producción:[GeeksForGeeks, A Computer Science, Portal]
- Usando flujos en Java 8 Usando la API de flujos introducida en JAVA 8 , es posible clonar una lista. El método collect() (junto con el método toList() ) se usa para clonar una lista.
Acercarse:
- Crear una clase
- Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
- Convierte una lista de objetos en un flujo de objetos usando el método stream().
- Utilice los métodos de recopilación (Collectors.toList()) para recopilar todas las instancias de la lista de elementos de transmisión y devolverlas a la lista clonada.
El siguiente programa ilustra este concepto.
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
import
java.util.stream.Collectors;
// Program to clone a List in Java
class
Example {
public
static
void
main(String[] args)
{
// Create a list
List<String> original
= Arrays.asList(
"GeeksForGeeks"
,
"A Computer Science"
,
"Portal"
);
// Clone a list
List<String> cloned_list
= original.stream()
.collect(Collectors.toList());
System.out.println(cloned_list);
}
}
Producción:[GeeksForGeeks, A Computer Science, Portal]
- Usando el método clone(): El método Clone() de una clase en Java se usa para crear una nueva instancia de una clase del objeto actual e inicializa todos sus campos con el contenido del objeto especificado. Para clonar una lista, uno puede iterar a través de la lista original y usar el método de clonación para copiar todos los elementos de la lista y usar el método de agregar para agregarlos a la lista.
Sintaxis:
protected Object clone() throws CloneNotSupportedException
Acercarse:
- Cree una clase clonable, que tenga anulado el método de clonación.
- Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
- Crea una lista vacía.
- Recorra cada elemento de la lista original e invoque el método clone() del objeto de la clase (que devuelve la instancia de la clase) y use el método add() para agregarlo a la nueva lista.
El siguiente ejemplo ilustra este concepto.
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
// Class needs to be cloneable
class
GfG
implements
Cloneable {
String username;
String msg;
// Constructor
GfG(String username, String msg)
{
this
.username = username;
this
.msg = msg;
}
// To print the objects in the desired format
@Override
public
String toString()
{
return
"\nHello "
+ username +
" !\n"
+ msg +
"\n"
;
}
// Overriding the inbuilt clone class
@Override
protected
GfG clone()
{
return
new
GfG(username, msg);
}
}
// Program to clone a List in Java
class
Example {
public
static
void
main(String[] args)
{
// Creating a list
List<GfG> original
= Arrays.asList(
new
GfG(
"Geeks"
,
"GeeksForGeeks"
),
new
GfG(
"GFG"
,
"A computer science portal for geeks"
));
// Creating an empty list
List<GfG> cloned_list
=
new
ArrayList<GfG>();
// Looping through the list
// and cloning each element
for
(GfG temp : original)
cloned_list.add(temp.clone());
System.out.println(cloned_list);
}
}
Producción:[ Hello Geeks ! GeeksForGeeks, Hello GFG ! A computer science portal for geeks ]
- Uso de Apache Commons Lang : También se puede lograr lo mismo utilizando el método de clonación proporcionado por bibliotecas de terceros, como Apache Commons Lang.
Sintaxis:public static T clone(T object) where T is the type of the object and object is the Serializable object to be cloned
Acercarse:
- Cree una clase Serializable.
- Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
- Crea una lista vacía.
- Recorra cada elemento de la lista original e invoque el método SerializationUtils.clone() de los objetos serializables (que devuelve la instancia de clase) y use el método add() para agregarlo a la nueva lista.
El siguiente programa ilustra este caso.
import
org.apache.commons.lang3.SerializationUtils;
import
java.io.Serializable;
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
// Class should be Serializable
class
GfG
implements
Serializable {
String username;
String msg;
// Constructor
GfG(String username, String msg)
{
this
.username = username;
this
.msg = msg;
}
// Overriding to print the objects
// in the desired manner
@Override
public
String toString()
{
return
"\nHello "
+ username
+
" !\n"
+ msg +
"\n"
;
}
}
// Program to clone a List in Java
class
Example {
public
static
void
main(String[] args)
{
// Creating the list
List<GfG> original
= Arrays.asList(
new
GfG(
"Mukkesh"
,
"Hey there fellows!"
),
new
GfG(
"McKenzie"
,
"Welcome to my page!"
));
// Creating an empty list
List<GfG> cloned_list =
new
ArrayList<GfG>();
// Looping through the list
// and cloning each element
// using SerializationUtils.clone
for
(GfG temp : original)
cloned_list.add(
SerializationUtils.clone(temp));
System.out.println(cloned_list);
}
}
Producción:
[ Hello Mukkesh ! Hey there fellows!, Hello McKenzie ! Welcome to my page! ]
- Usando la biblioteca Gson para convertir la lista a JSON : usando la biblioteca Gson de Google, una lista se puede convertir a JSON. Esta string JSON se puede convertir en un objeto de tipo Lista y se puede usar para inicializar la nueva Lista.
Sintaxis:
String gson.toJson(List a); Returns a JSON string of the List object a. List gson.fromJson(String b, Class T) Returns a list of type Class T, from the JSON string b.
Acercarse:
- Crear una clase
- Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
- Utilice la función toJson() para crear una string JSON de la lista original, pasando la misma como parámetro a esta función.
- Almacene la string JSON devuelta
- Cree una lista vacía e inicialícela directamente con el valor de la lista original utilizando la función fromJson() y pasando la string JSON almacenada como parámetro.
El siguiente programa ilustra esto.
import
com.google.gson.Gson;
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
// Class should be Serializable
class
GfG
implements
Serializable {
String username;
String msg;
// Constructor
GfG(String username, String msg)
{
this
.username = username;
this
.msg = msg;
}
// Overriding to print the object
// in the desired format
@Override
public
String toString()
{
return
"\nHello "
+ username +
" !\n"
+ msg +
"\n"
;
}
}
// Program to clone a List in Java
class
Example {
public
static
void
main(String[] args)
{
// Creating a new list
List<GfG> original
= Arrays.asList(
new
GfG(
"Mukkesh"
,
"Hey there fellows!"
),
new
GfG(
"McKenzie"
,
"Welcome to my page!"
));
// Creating a gson object
Gson gson =
new
Gson();
// Converting the list into a json string
String jsonstring
= gson.toJson(original);
// Converting the json string
// back into a list
List<GfG> cloned_list
= gson.fromJson(jsonstring, GfG);
System.out.println(cloned_list);
}
}
Producción:
[ Hello Mukkesh ! Hey there fellows!, Hello McKenzie ! Welcome to my page! ]
- Usando el paquete Reflection: El paquete Reflection también se puede usar para clonar una Lista.
Acercarse:
- Cree una clase clonable, que tenga anulado el método de clonación.
- Cree una lista de los objetos de clase a partir de una array utilizando el método asList.
- Crea una lista vacía.
- Obtenga el método de clonación de la clase utilizando el método getClass().getDeclaredMethod(“clone”) (en un elemento de la lista) y guárdelo como una instancia de método.
- Recorra cada elemento de la lista e invoque el método almacenado, que devolverá una instancia de clase, que se puede agregar a la nueva lista.
import
java.lang.reflect.InvocationTargetException;
import
java.lang.reflect.Method;
import
java.util.ArrayList;
import
java.util.Arrays;
import
java.util.List;
// GfGclass implements Cloneable Interface
class
GfG
implements
Cloneable {
String username;
String msg;
// Constructor
GfG(String username, String msg)
{
this
.username = username;
this
.msg = msg;
}
// Overriding to print the object
// in the desired format
@Override
public
String toString()
{
return
"\nHello "
+ username
+
"!\n"
+ msg +
"\n"
;
}
// Overriding the clone function
@Override
protected
Object clone()
throws
CloneNotSupportedException
{
return
new
GfG(username, msg);
}
}
class
ListUtils {
// Create a cloning function
public
static
<T
extends
Cloneable> List<T>
clone(List<T> original)
throws
NoSuchMethodException,
InvocationTargetException,
IllegalAccessException
{
// Boundary conditions checked
if
(original ==
null
|| original.size() ==
0
) {
return
new
ArrayList<>();
}
// Get the clone method from the GfG class
Method method
= original.get(
0
)
.getClass()
.getDeclaredMethod(
"clone"
);
// Create an empty list for cloning
List<T> clone =
new
ArrayList<>();
// Loop through the list and
// invoke the clone method of each element
for
(T item : original) {
clone.add((T)method.invoke(item));
}
// Return the cloned list
return
clone;
}
public
static
void
main(String[] args)
{
// Creating a list
List<GfG> original
= Arrays.asList(
new
GfG(
"Geeks"
,
"GeeksForGeeks"
),
new
GfG(
"GFG"
,
"A computer science portal for geeks"
));
// Create an empty list for cloning
List<GfG> cloned_list =
null
;
// Use try and catch for exception handling
try
{
cloned_list = clone(original);
}
catch
(NoSuchMethodException e) {
e.printStackTrace();
}
catch
(InvocationTargetException e) {
e.printStackTrace();
}
catch
(IllegalAccessException e) {
e.printStackTrace();
}
// Print the cloned list
System.out.println(cloned_list);
}
}
Producción:[ Hello Geeks! GeeksForGeeks, Hello GFG! A computer science portal for geeks ]
Publicación traducida automáticamente
Artículo escrito por MukkeshMckenzie y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA