Dado que la biblioteca central de Java no tiene dicha colección, ¿una matriz sería la mejor opción, especialmente si uno no desea confiar en bibliotecas de terceros?¿Cómo implementar una "lista" de tamaño fijo en Java?
Respuesta
Escribía una clase contenedora alrededor de un ArrayList
, y en los métodos add
y addAll
, buscaba el tamaño de la lista antes de agregar nuevos elementos. Si ha alcanzado el tamaño máximo, puede lanzar una excepción (o no hacer nada, dependiendo de lo que realmente quiera hacer en su código).
Aquí hay un pequeño ejemplo:
public class SizeLimitedArray<E> implements java.util.List<E>
{
private static final int DEFAULT_SIZE_LIMIT = 10;
private ArrayList<E> myList;
private int maxSize;
public SizeLimitedArray()
{
this (DEFAULT_SIZE_LIMIT);
}
public SizeLimitedArray (int size)
{
myList = new ArrayList<E> (size);
maxSize = size;
}
@Override
public boolean add (E objectToAdd)
{
if (myList.size() > maxSize)
{
throw new IllegalStateException ("The array is full");
}
return myList.add (objectToAdd);
}
@Override
public boolean addAll (Collection collectionToAdd)
{
if (myList.size() + collectionToAdd.size() > maxSize)
{
throw new IllegalStateException ("The array is full");
}
return myList.addAll (collectionToAdd);
}
// Rest of class omitted for brevity
}
Puede usar una matriz o ArrayList<E>
preinicializada con el tamaño deseado.
Si desea activamente evitar la expansión de la lista, y luego usar una matriz es probablemente la más fácil.
Arrays.asList(T ...)Returns a fixed-size list backed by the specified array
Object[] array = new Object[10];
List<Object> fixedList = Arrays.asList(array);
Entonces, si intento agregar otro objeto a 'fixedList' que ya contiene 10 objetos, ¿arrojará una excepción o simplemente fallará en silencio? – mre
add le dará UnsupportedOperationException, usted solo puede usar set y get, básicamente se comporta como una matriz. –
Bien se podría heredar de la clase ArrayList
por ejemplo y reimplementar el método add
a no ser capaz de añadir más allá de una determinada cantidad de elementos. O, incluso mejor como puntero por Laf, use la composición:
public class MyArrayList<T> {
private ArrayList<T> innerList;
private int maxSize;
public boolean add(T item) {
if(innerList.size() < maxSize) {
return innerList.add(item);
} else {
return false;
}
}
}
Eso es algo de lo que estaba pensando que tendría que ir si no quería usar una matriz. – mre
No recomendaría la herencia en este caso, sino una clase contenedora. Anular el método 'add' podría crear más problemas, porque te vuelves dependiente de la implementación' ArrayList'. Esto es algo que Josh Bloch menciona en su libro _Effective Java_. – Laf
@mre: He publicado un ejemplo. – Tudor
Simplemente implemente la suya. Podría usar un enfoque basado en proxy. Defina su propia lista respaldada por ArrayList
. Haga que la lista interna sea privada. También implemente un campo simple limit
que tiene un valor predeterminado y también se puede establecer a través de un constructor.
Su lista implementará List
, y para cada método que modifique la lista interna, incremente y disminuya el conteo de manera apropiada. Si el tamaño excede el límite, lanza algún tipo de excepción. Algo así como
public class FixedList implements List {
private ArrayList<E> list = new ArrayList<E>();
private int limit = 10; // default
FixedList(){} // default constructor
FixedList(int limit) {
this.limit = limit;
}
public boolean add(E object) {
if (this.list.size() == limit - 1) {
// throw some sort of LimitExceeded Runtime Exception
}
this.list.add(object);
}
...
}
Tendrá que trabajar en los genéricos, y recordar a apoyar a los casos en los que se añaden múltiples cosas a la vez addAll
.
Así que tomamos una 'ArrayList' que se implementó para permitirnos ampliar el tamaño de las matrices de forma dinámica y luego cambiar su comportamiento para que no podamos seguir haciéndolo. Bueno, sí, 'no no x' es lo mismo que' x', pero eso no tiene sentido, ¿no? – Voo
No estoy seguro de cuál es su punto. ¿Estás diciendo que su lista personalizada debería estar respaldada por una matriz en su lugar? – hvgotcodes
Bueno, eliminaste toda la funcionalidad adicional que 'ArrayList' agregaba sobre una matriz simple, así que solo podíamos usar la matriz en sí misma, o si necesitamos las funciones de agregar y compartir, sí solo una copia de seguridad de una matriz sería más simple también. – Voo
Uso Collections.unmodifiableList(List<T> list)
. Esto devolverá un objeto genérico List<T>
que arroja UnsupportedOperationException
si intenta agregar (o eliminar) elementos.
Probablemente me queme, pero también puede usar un ArrayBlockingQueue para esto. Lo que proporciona la ventaja de poder utilizar los métodos Colección regulares.
Sin embargo, no ofrece acceso a * todos los métodos de la lista (es decir, no implementa ningún tipo de lista), particularmente métodos de acceso basados en índices, que (para mí de todos modos) sería la razón principal para usar un lista en primer lugar. –
Es cierto, actualicé mi respuesta para reflejar que realmente implementa las operaciones de recolección, no la lista. – Perception
public class libsystem extends javax.swing.JFrame {
//public static ArrayList<books> al = new ArrayList<books>();
public static List<books> al = Arrays.asList(new books[100]);
public libsystem() {
initComponents();
}
String msg =jTextArea1.getText();
try {
FileWriter fs=new FileWriter("library.txt");
try(
BufferedWriter out= new BufferedWriter(fs)){;
out.write(msg);
}
} catch (Exception e){
System.err.println("wrong" + e.getMessage());
}
String line;
String id,name,type;
try{
FileReader in=new FileReader("library.txt");
try (BufferedReader br = new BufferedReader(in)) {
while((line=br.readLine())!=null){
StringTokenizer st1 = new StringTokenizer(line,",");
while(st1.hasMoreTokens()){
id=st1.nextToken();
name=st1.nextToken();
type=st1.nextToken();
books book=new books(id,name,type);
al.add(book);
}
br.close();
for(int i=0;i<al.size();i++){
books obj = al.get(i);
System.out.println("Book NAme :"+obj.getName()+ "\n" +" Name:"+obj.getAuthor()+ "\n"+"Type :"+obj.getSubject()+"\n");
}
- 1. Tamaño fijo en lista
- 2. Defina una lista de tamaño fijo en Java
- 3. Cómo mantener el índice de lista fijo en Java
- 4. Python, forzando una lista a un tamaño fijo
- 5. Crear una pila de tamaño fijo
- 6. Cómo implementar un pliegue lista en Java
- 7. Problema IList. ¿Tamaño fijo?
- 8. ¿Hay una cola de tamaño fijo que elimine elementos excesivos?
- 9. Tamaño de cadena fijo en C#
- 10. ¿Pasar arreglos de tamaño fijo en C++?
- 11. ¿Hay enteros de tamaño fijo en GCC?
- 12. lista de objetos Java que toda implementar una interfaz
- 13. Redimensionar/recortar/rellenar una imagen en un tamaño fijo
- 14. ¿Qué contenedor de STL C++ usar para una lista de tamaño fijo?
- 15. ¿Cómo especifico un buffer de tamaño fijo en C++/CLI?
- 16. tamaño fijo matriz de tipo Estructura
- 17. ¿es posible crear una ventana de exceso de tamaño fijo?
- 18. iTextSharp: ¿Cómo cambiar el tamaño de una imagen para que se ajuste a un tamaño fijo?
- 19. Tipos de coma flotante de tamaño fijo
- 20. Implementación malloc del buffer de tamaño fijo
- 21. bucle de una matriz de tamaño fijo sin definir su tamaño en C
- 22. Cómo invertir una lista en Java?
- 23. Cómo implementar callbacks en Java
- 24. Cómo implementar OpenID en Java
- 25. IE 8: Fondo de tamaño fijo
- 26. cómo implementar macros en java
- 27. ¿Define una matriz doble sin un tamaño fijo?
- 28. UIButton imagen personalizada tamaño fijo con
- 29. ¿Cómo implementar una tabla hash de tamaño dinámico?
- 30. Cons'ing una lista en Java
¿Qué comportamiento desea cuando intenta agregar un artículo a una lista completa? Probablemente también deberías tener un método que verifique si hay espacio. – toto2
Arrays.asList hace _exactly_ esto. –
La pregunta es ambigua: ¿la lista es fija? o su tamaño es fijo? – toto2