Java 需要建议如何打印ArrayList的剩余容量

Java 需要建议如何打印ArrayList的剩余容量,java,netbeans,Java,Netbeans,我试图弄清楚,当删除1个对象时,如何获得剩余可用插槽的输出 ListOfMembers = new ArrayList<>(100); which caps my list at 100. ListOfMembers=newarraylist(100);这使我的名单上限为100。 每当我从列表中删除1时,我都需要打印ArrayList中剩余的空间 public boolean DeleteMember() { Scanner in = new Sc

我试图弄清楚,当删除1个对象时,如何获得剩余可用插槽的输出

    ListOfMembers = new ArrayList<>(100); which caps my list at 100.
ListOfMembers=newarraylist(100);这使我的名单上限为100。
每当我从列表中删除1时,我都需要打印ArrayList中剩余的空间

    public boolean DeleteMember() {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter the membership number: ");
        String pno = in. nextLine();
        for(int i=0;i<ListOfMembers.size();++i) {
            if(ListOfMembers.get(i).getMembershipNumber().equals(pno)) {
                ListOfMembers.remove(i);
                System.out.println("Space available: " +?????);
                return true;
            }
        }
                System.out.println("Numbership number does not exist");
        return false;
    }
public boolean deletember(){
扫描仪输入=新扫描仪(系统输入);
System.out.println(“输入会员编号:”);
字符串pno=in.nextLine();

对于(int i=0;i阅读的规范,它说实现不能简单地实现
add
;或者拒绝基于类型或元素的某些属性添加元素;但是它没有说列表可以拒绝基于列表的当前大小添加元素。因此,在大小上设置上限违反了

您可以定义
LimitedSizeList实现集合
,但它不能是
java.util.List
的真正实现

您可以通过扩展以下内容轻松实现
LimitedSizeList

class LimitedSizeList扩展了AbstractCollection{
私有最终列表=新的ArrayList();
私人最终int能力;
LimitedSizeList(内部容量){
这个。容量=容量;
}
//填写Javadoc中描述的方法:
@凌驾
公共迭代器迭代器(){return list.Iterator();}
@凌驾
public int size(){return list.size();}
@凌驾
公共布尔加法(E元素){
//Collection.add允许您抛出非法状态异常
// https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#add-E-

如果(remainingCapacity()您似乎误解了arraylist的工作原理

newarraylist(100)
没有cap列表。100只是一个提示

ArrayList被定义为允许无限*增长,它没有限制项目数量的功能

ArrayList通过使用一个数组来保存元素而“隐藏”工作。问题是,java不允许数组增长或收缩。ArrayList通过两个技巧解决了这个问题:

  • 通过在内部跟踪ArrayList的长度,ArrayList impl可以使用“太大”的数组
  • 如果已填充arraylist,使其包含的项目与“backing array is large”相同,并且添加了另一个项目,arraylist会出现问题-backing array空间不足。arraylist将创建一个新的、更大的数组,复制旧数组中的所有元素,现在添加新项目(因为有空间;此新数组更大),然后清除旧数组
  • 100
    在构造函数中所做的唯一一件事就是作为一个提示:最初应该将后备数组设置为多大。开箱即用(仅
    new ArrayList()
    ),默认提示为10

    试试看!运行以下命令:

    List<String> list = new ArrayList<String>(100);
    for (int i = 0; i < 200; i++) list.add("" + i);
    System.out.println(list.size());
    
    List List=newarraylist(100);
    对于(inti=0;i<200;i++)列表,添加(“+i”);
    System.out.println(list.size());
    
    该代码将编译良好,运行良好,并打印200。从而证明“100”与限制此列表的大小完全无关

    那么,如何限制arraylist的大小

    您不需要。Arraylist无法做到这一点。相反,您需要包装或扩展。对于重要的代码库,我强烈建议包装,但对于一个简单的练习,扩展可以使代码稍微短一些:

    public class LimitedList<T> extends ArrayList<T> {
        private final int limit;
    
        public LimitedList(int limit) {
            this.limit = limit;
        }
    
        @Override public boolean add(T in) {
            if (size() >= limit) throw new IllegalStateException("List is full");
            super.add(in);
        }
    
        @Override public boolean addAll(Collection<T> in) {
            // left as an exercise for the reader
        }
    
        @Override public boolean addAll(int index, Collection<T> in) {
            // left as an exercise for the reader
        }
    
        @Override public boolean add(int idx, T in) {
            // left as an exercise for the reader
        }
    
        @Override public List<T> subList(int from, int to) {
            // this one gets complicated!
            // let's just not allow it.
            throw new UnsupportedOperationException();
        }
    
        public int available() {
            return limit - size();
        }
    }
    
    公共类LimitedList扩展了ArrayList{
    私人最终整数限制;
    公共限制列表(整数限制){
    这个极限=极限;
    }
    @重写公共布尔外接程序(T in){
    如果(size()>=limit)抛出新的非法状态异常(“列表已满”);
    super.add(in);
    }
    @重写公共布尔addAll(中的集合){
    //留给读者作为练习
    }
    @重写公共布尔addAll(整数索引,集合中){
    //留给读者作为练习
    }
    @重写公共布尔加法(int-idx,T-in){
    //留给读者作为练习
    }
    @覆盖公共列表子列表(int-from,int-to){
    //这个变得复杂了!
    //让我们不要让它发生。
    抛出新的UnsupportedOperationException();
    }
    公共int可用(){
    返回限制-size();
    }
    }
    
    注意:正如您所看到的,您必须非常小心并覆盖可能会增加列表的每个方法;这就是为什么创建一个新类型,它根本不扩展ArrayList,而是有一个ArrayList类型的字段(当然,还有一个int类型的字段用于限制),可以更好:现在你必须明确地考虑列表中的每个方法,而不是祈祷你涵盖了所有添加内容的方法


    *)实际上,你最多只能有2^31-1个元素。

    你可以使用反射来完成这个任务,首先获得容量,然后减去实际大小

        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            list.add("e");
            list.add("h");
            try {
                Field field = list.getClass().getDeclaredField("elementData");
                field.setAccessible(true);
                int cap = Array.getLength(field.get(list));
                System.out.println("The capacity: " + cap);
                System.out.println("The size: " + list.size());
                System.out.println("The remaining capacity: " + (cap - list.size()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    容量是一个内部指标,用于动态增加
    ArrayList()使用的可用空间通常,这对用户的管理方式没有影响,因为这是一个内部问题

    但是,能够设置容量允许用户指定一个值,该值指示列表将保留的初始内容。优点是,它允许列表填充备份数组,而无需不断重新调整容量,从而导致大量对象复制

    调整容量 您还可以随时使用该方法增加容量

    减少容量 您还可以使用方法释放未使用的容量。这可能会释放内存中的内存


    但上述任何一项都不会阻止您向列表中添加其他条目。它们只允许您根据数据的先验知识做出最佳选择。

    您将限制设置为100,您不能执行100 ListOfMembers.size(),以获得
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            list.add("e");
            list.add("h");
            try {
                Field field = list.getClass().getDeclaredField("elementData");
                field.setAccessible(true);
                int cap = Array.getLength(field.get(list));
                System.out.println("The capacity: " + cap);
                System.out.println("The size: " + list.size());
                System.out.println("The remaining capacity: " + (cap - list.size()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    The capacity: 10
    The size: 6
    The remaining capacity: 4