在一次采访中,我被要求打印一个长度和维度未知的数组的所有元素。我找不到办法,但面试官说可以。谁能告诉它怎么做?
5 回答
在 Java 中,数组的大小总是已知的。没有 a 就不能创建数组,length
所以这个问题在 Java 中没有意义。
在 C++ 中,您要么知道长度,要么不知道。你不能处于不知道长度的位置,但你可以计算出来,因为那样你就会知道长度。他们可能的意思是有一个像 0 这样的标记值,而不是作为长度存储,但是一旦你找到这样的标记值,你就会知道长度。
这个问题真的只在 C++ 中有意义,所以这就是我要解决的问题。假设你真的有一个数组(不仅仅是一个指向数组开头的指针)你可以做到。诀窍是将数组(通过引用)传递给可以从其类型推断其大小的函数模板:
#include <iostream>
template <class T, size_t N>
void print(T (&array)[N]) {
for (size_t i=0; i<N; i++)
std::cout << array[i] << "\n";
}
int main() {
int array1[] = {1, 2, 3, 4, 5};
char array2[] = {'a', 'b', 'c', 'd'};
print(array1);
std::cout << "\n";
print(array2);
}
在 C++ 中,自动或静态存储数组的长度可以认为是已知的,您可以使用sizeof
运算符或模板来获取它。另一方面,您无法确定动态分配的数组的长度,也无法确定数组的长度,因为您只有一个指向该数组的指针。这也适用于自动或静态存储数组在它们衰减为指针的上下文中。
为了说明第一点,这里有一个打印自动存储数组元素的函数示例:
template< class T, size_t N >
void print_array(const T (&array)[N] )
{
for (size_t i = 0; i < N; ++i)
std::cout << i <<" ";
std::cout << std::endl;
}
以及一个使用示例:
int [] data = {1, 2, 3, 4, 5, 6};
print_array(data);
现在,要在 C++ 中回答这个问题,没有一种符合标准的方法不会调用未定义的行为来打印您不知道或无法通过与打印它相同的机制找到其大小的数组元素。打印元素要求您拥有或获得数组长度的知识。
If you want an Iterator over an array in java, you could use one of the direct implementations out there. For example:
Apache Commons Collections ArrayIterator
Or, this one, if you'd like to use generics:
com.Ostermiller.util.ArrayIterator
Note that if you want to have an Iterator, over primitive types, you can't, because a primitive type can't be a generic parameter. E.g., if you want an Iterator, you have to use an Iterator instead, which will result in a lot of autoboxing and -unboxing if that's backed by an int[].
我假设您没有关于数组类型的任何信息,例如当您只有 Object 引用它时。在这种情况下...
在 Java 中有一个java.lang.reflect.Array
类可以用来帮助你处理数组,比如获取它的元素、它的长度等等。您还可以使用java.lang.Class
类来获取有关任何对象类的类型的信息,例如isArray()
如果它是数组getComponentType()
来查看数组元素的类(因为String[]
它将返回String
)。
这是一些可用于从一维或多维数组中打印元素的代码示例
public static void printElements(Object someArray) {
if (someArray == null) {
System.out.print(someArray);
return;
}
Class<?> clazz = someArray.getClass();
if (clazz.isArray()) {// we need to iterate over its elements
int length = Array.getLength(someArray);
System.out.print("[");
for (int i = 0; i < length; i++) {
// lets test if array is multidimensional
if (clazz.getComponentType().isArray()) {// if element is also
// arrays
// we can process them with our method
printElements(Array.get(someArray, i));
} else {// here element is not an array
// so we can print it
System.out.print(Array.get(someArray, i));
if (i < length - 1)
System.out.print(", ");
}
}
System.out.print("]");
} else {
System.out.println(someArray+" is not an array!");
}
}
用法:
int[][][] arr = { { { 1, 2, 3 }, null, { 4, 5 } }, {} };
printElements(arr);
输出:
[[[1, 2, 3]null[4, 5]][]]