Java 需要建议如何打印ArrayList的剩余容量
我试图弄清楚,当删除1个对象时,如何获得剩余可用插槽的输出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
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