如何知道这个数组的大小

时间:2016-10-07 12:21:56

标签: java

我有关于数组的问题..  假设我有一个包含未知大小数组的对象(A),并且我没有对数组大小或数组本身的任何访问权限,但是我可以在对象A上应用以下方法:

  • 完整
  • 添加(在最后一个元素之后)
  • 删除(最后一个元素;这会返回删除的元素)

我怎么知道数组的大小??

3 个答案:

答案 0 :(得分:2)

首先调用add直到Array已满,然后删除并计算你移除了多少次,直到Array为空,你有大小,如下所示:

    SomeArray a = ...
    SomeThingThatArrayCanStore something = ...;

    while (!a.full()) {
       a.add(something);
    }

    int size = 0;

    while (!a.empty()) {
       a.remove()
       size++;
    }

    // here you have the size

答案 1 :(得分:1)

你不需要full:那是一个红鲱鱼。

这是一个解决方案,无需显式创建临时容器即可实现此目的。基本上我正在使用堆栈框架来构建一个已删除元素的容器。

如果A是数组的类型,a实例,remove()函数返回删除的对象,那么

int size(int n, A a){    
    if (a.empty()){
        return n; // all done, n holds the number of elements removed
    }
    Object o = a.remove(); // pop the element
    int ret = size(n + 1, a); // call self with the array truncated
    a.add(o); // push the element back
    return ret;
}

是一种方法,如果你最初在n设置为零的情况下调用它。它在堆叠框架的创建方面非常昂贵,但却有一种奇怪的优雅。

答案 2 :(得分:0)

尝试一些有趣的反射:反射允许您访问私有字段和未知字段。这就像黑暗魔法:强大而危险!

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.List;

public class ArrayFinder  {

    public void printAllArraysLength(A a) throws IllegalArgumentException, IllegalAccessException {
        for (Field field : A.class.getDeclaredFields()) {       // get all private fields
            field.setAccessible(true);      // private are now public !
            Object array = field.get(a);    // get the field content.
            try{
                System.out.println(field.getName() + " length : " +  getArrayLenth(array));
            }catch(Exception e){
                System.out.println(field.getName() + " is not an array");
            }
        }
    }

    private int getArrayLenth(Object array) {
        Class arrayClass = array.getClass().getComponentType();
        if(arrayClass == null){
            // no component type, maybe a list.
            return  ((List) array).size();
        }
        else {
            if (arrayClass.isPrimitive()) {
                return   Array.getLength(array);
            }else{
                return   ((Object[]) array).length;
            }
        }
    }
}

好的,这可能不是你的老师希望你做的添加/删除/空和完全。