【问题标题】:How do you limit the size of an ArrayList? [duplicate]如何限制 ArrayList 的大小? [复制]
【发布时间】:2020-06-24 21:14:54
【问题描述】:

我正在尝试创建一个最多可容纳 100 件物品的空 ADT 袋。

public class ListArrayListBased implements ListInterface {

   private ArrayList<Object> data;

   public ListArrayListBased() {
        this.data = new ArrayList<Object>();

如何将 ArrayList 限制为 100 个对象?

【问题讨论】:

  • @towhid 这只是设置初始容量,不是限制
  • 可以创建一个数组(new Object[100]),然后使用Arrays.asList制作一个不能修改的List
  • 您不能限制列表的大小。但是您可以通过调用Collections.unmodifiableList() 来预先填写一个列表并在填写完列表后创建一个不可修改的集合
  • ArrayList 并不意味着有限制。您应该将 ArrayList 包装在一个类中(例如ADTBag)并自己实现该逻辑
  • 什么是“ADT 包”,您为什么提到它?

标签: java arraylist collections


【解决方案1】:

您不能直接限制ArrayList 的大小,但由于它没有暴露,只能通过ListArrayListBased 的方法添加,因此您可以明确检查大小。例如:

public void add(Object o) {
    if (data.size() >= 100) {
        throw new IllegalArgumentException("data is full");
    }
    data.add(o);
}

【讨论】:

    【解决方案2】:

    您可以覆盖 add 方法。可能还有其他方法也需要被覆盖。我相信虽然addAll 会调用add

    List<Integer> list = new ArrayList<>() {
        @Override
        public boolean add(Integer v) {
            if(size() < 10) {
                return super.add(v);
            }
            return false;
        }
    };
    
    for (int i = 0; i< 11; i++) {
        System.out.println(list.add(i));
    }
    

    打印

    true
    true
    true
    true
    true
    true
    true
    true
    true
    true
    false
    

    【讨论】:

    • 刚刚检查了源代码(应该早点完成)。显然,ArrayList.addAll 的当前实现不调用add
    • 有四种 add 方法,add(Integer)add(int,Integer)addAll(Collection&lt;? extends Integer&gt;)addAll(int index, Collection&lt;? extends Integer&gt;),并且没有保证可以调用另一个。此外,list.listIterator().add(…) 目前确实委托给list.add(index, element),但这可能会改变。 ArrayList 的未来版本也有可能提供其他添加元素的方法。这就是为什么你应该扩展为扩展而设计的类,即AbstractList&lt;E&gt;保证所有添加操作都使用add(int index, E element)
    【解决方案3】:

    List.of( array )

    您可以将数组传递给List.of,从而得到一个固定大小的数组大小的non-modifiableList。不能添加、删除或替换元素。

    Object[] arr = new Object[100] ;
    … populate array 
    List< Object > objs = List.of( arr ) ;
    

    循环缓冲区(又名循环缓冲区或环形缓冲区)

    或者,也许您想要一个非阻塞队列,当尝试将新元素添加到队列中并且它已满时,它会自动从队列头部驱逐元素。

    如果是这样,请参阅问题上的my AnswerIs there a fixed sized queue which removes excessive elements?。我提到了来自 Google Guava 的 EvictingQueue 和来自 Apache Commons 的 CircularFifoQueue

    要实例化 EvictingQueue,请调用静态工厂方法 create 并指定您的最大大小。

    EvictingQueue< Person > people = com.google.common.collect.EvictingQueue.create( 100 ) ;  // Set maximum size to 100. 
    

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2019-02-27
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多