Как реализовать «список» фиксированного размера в Java? - PullRequest
8 голосов
/ 23 января 2012

Поскольку у базовой библиотеки Java такой коллекции нет, будет ли лучше всего использовать массив, особенно если не нужно полагаться на сторонние библиотеки?

Ответы [ 8 ]

12 голосов
/ 23 января 2012

Arrays.asList (T ...) Returns a fixed-size list backed by the specified array

Object[] array = new Object[10];
List<Object> fixedList = Arrays.asList(array);
5 голосов
/ 23 января 2012

Вы можете использовать массив или ArrayList<E>, предварительно инициализированный с желаемым размером.

Если вы хотите активно предотвратить расширение списка, тогда используйте массиввероятно, самый простой.

4 голосов
/ 23 января 2012

Я бы написал класс-оболочку вокруг ArrayList, а в методах add и addAll я бы проверил размер списка перед добавлением новых элементов. Если вы достигли максимального размера, вы можете выбросить исключение (или ничего не делать, в зависимости от того, что вы действительно хотите сделать в своем коде).

Вот краткий пример:

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
    }
3 голосов
/ 23 января 2012

Просто реализуй свой. Вы можете использовать прокси-подход. Определите свой собственный список, который поддерживается ArrayList. Сделайте внутренний список закрытым. Также реализуйте простое поле limit, которое имеет значение по умолчанию и также может быть установлено с помощью конструктора.

Ваш список будет реализовывать List, и для каждого метода, который изменяет внутренний список, увеличивает и уменьшает счетчик соответствующим образом. Если размер превышает лимит, выведите какое-то исключение. Что-то вроде

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);
    }
    ...
}

Вам придется поработать над дженериками, и не забывайте поддерживать случаи, когда несколько вещей добавляются одновременно addAll.

2 голосов
/ 23 января 2012

Ну, например, вы могли бы унаследовать от класса ArrayList и переопределить метод add, чтобы не иметь возможности добавлять после заданного количества элементов.Или, что еще лучше, как указание Лафа, используйте состав:

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;
         }
     }
}
0 голосов
/ 22 июня 2016
 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");                 

        }         
0 голосов
/ 23 января 2012

Я, вероятно, сгорю, но вы также можете использовать ArrayBlockingQueue для этого.Что дает возможность использовать обычные методы Collection .

0 голосов
/ 23 января 2012

Используйте Collections.unmodifiableList(List<T> list). Это вернет общий List<T> объект, который выбрасывает UnsupportedOperationException, если вы попытаетесь добавить (или удалить) элементы.

...