我有关于数组的问题.. 假设我有一个包含未知大小数组的对象(A),并且我没有对数组大小或数组本身的任何访问权限,但是我可以在对象A上应用以下方法:
我怎么知道数组的大小??
答案 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;
}
}
}
}
好的,这可能不是你的老师希望你做的添加/删除/空和完全。