java - values - ¿Inicializando la lista<T> con un número dado de nulos sin bucle?
list string string java (9)
Lo que hice fue
MyClass[] array = {new MyClass(), new MyClass(), new MyClass(), new MyClass(), new ProfileSectionDTO(), new MyClass()};
List<MyClass> MyClassList = Arrays.asList(array);
Sucio, pero trabajando :)
¿Se puede inicializar una List<T>
para que contenga un número dado de null
s, donde T es un parámetro de tipo de la clase de la que la lista es miembro? Claro que puedo hacerlo con un bucle, pero me gustaría saber si es posible sin él.
List<T> myList = new ArrayList<T>(numEls);
crea una lista de la capacidad dada, pero el tamaño 0, por lo que myList.get(x)
falla para todas las x
, y también lo hace, por ejemplo, myList.set(numEls-1,null)
.
myList = Arrays.asList(new T[numEls]);
no compila, y
myList = (List<T>) Arrays.asList(new Object[numEls]);
se compila en Eclipse (con una advertencia de lanzamiento sin marcar), pero no con javac.
Actualización: ¡ Gracias por las respuestas! Sin embargo, encontré otra solución, bastante breve, cercana a mi último intento anterior, que compila tanto en eclipse como con nuestro sistema de compilación automatizado: ¡ Convierta la matriz, no la lista!
myList = Arrays.asList((T[]) new Object[numEls]);
Lo que probablemente quieras es algo como esto ...
final int maxSize = 50;
List<T> v = new Vector<T>() {{setSize(maxSize);}};
Los vectores le permiten establecer un tamaño, que los llena con null
.
Necesitaría usar la reflexión para crear una instancia de una matriz de respaldo T[]
usando Array.newInstance()
:
public static <T> List<T> getListWithNulls(Class<T> componentType, int length) {
T[] array = (T[])Array.newInstance(componentType, length);
return new ArrayList<T>(Arrays.asList(array));
}
Como puede ver, esto requiere una referencia al objeto Class<T>
que representa el tipo de T
:
List<String> strListWithNulls = getListWithNulls(String.class, 100);
También asegúrese de no confundir las clases java.lang.reflect.Array
y java.util.Arrays
que se utilizan aquí.
Finalmente, tenga en cuenta que la reflexión va a ser mucho más lenta que solo usar un bucle.
No es realmente una solución, pero quería evitar un bucle.
void fillNullList(List<T> list, count) {
if (count > 0) {
list.add(null);
fillNullList(list, count - 1);
}
}
En serio, ¿por qué quieres evitar un bucle? Probablemente, desea una solución con complejidad O (1) y no una solución con complejidad O (n) independientemente de si se utiliza un bucle para no.
Nueva opción con streams:
Lista resultColumn = IntStream.range (0, 10000) .mapToObj (i -> null) .collect (Collectors.toList ());
Prueba esto:
List<String> list = new ArrayList<String>(Arrays.asList(new String[100]));
for(String string : list){
System.out.println(string);
}
Bueno, puedes escribir una jerarquía:
class Base<T>{
protected List<T> list;
public List<T> getList(){
return list;
}
}
class Child extends Base<String>{
public Child(){
list = new ArrayList<String>(Arrays.asList(new String[100]));
}
}
Se puede utilizar de la siguiente manera:
Base<String> base = new Child();
base.getList();
Si no necesitas mutar la lista ...
List<T> result = Collections.nCopies(num, (T) null);
... o alternativamente
List<T> result = new ArrayList<T>(Collections.nCopies(num, (T) null));
Si quieres un ArrayList
puedes usar la reflexión para hacer trampa
ArrayList<T> myList = new ArrayList<T>(numEls);
Field f = ArrayList.class.getField("size");//cache this
f.setAccessible(true);
f.setInt(myList, numEls);
Yo solo usaría un bucle, es más simple y es probable que también sea más rápido.
List<T> list =
while(list.size()<size) list.add(null);
Cualquier otro enfoque que utilice es probable que use un bucle para usted. Si esto está bien, simplemente escriba su propio método que oculta el bucle utilizado.