Java 打印长度和尺寸未知的数组

Java 打印长度和尺寸未知的数组,java,c++,arrays,loops,multidimensional-array,Java,C++,Arrays,Loops,Multidimensional Array,在一次采访中,我被要求打印长度和尺寸未知的数组的所有元素。我找不到办法,但面试官说可以做到。有人能告诉我们怎么做吗?在Java中,数组的大小总是已知的。没有长度就无法创建数组,因此这个问题在Java中没有意义 在C++中,你要么知道长度,要么不知道长度。你不能处于一个不知道长度的位置,但你可以计算出来,因为那样你就知道长度了。他们的意思是,有一个哨兵值,比如0,而不是被存储为一个长度,但是一旦你找到了这样的句子值,你就知道长度。 这个问题在C++里确实是有意义的,所以我要说的。假设您确实有一个数

在一次采访中,我被要求打印长度和尺寸未知的数组的所有元素。我找不到办法,但面试官说可以做到。有人能告诉我们怎么做吗?

在Java中,数组的大小总是已知的。没有
长度
就无法创建数组,因此这个问题在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);
}
#包括
模板
无效打印(T(&数组)[N]){

对于(C++中的sisixt i=0;i,可以考虑自动或静态存储数组的长度,可以通过使用 SigeOs运算符或模板来获得它。另一方面,不能确定动态分配的数组的长度,也不能确定数组中的长度。指向此类数组的指针。这也适用于自动或静态存储数组,它们在上下文中衰减为指针

为了说明第一点,下面是一个打印自动存储阵列元素的函数示例:

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;
}

现在,在C++中回答这个问题,没有标准兼容的方式,它不调用未定义的行为来打印一个数组的元素,这些数组的大小是你不知道或无法找到的,你可以用同样的机制来打印它。打印这些元素需要获得或获得数组长度的知识。

< P>假设您并没有关于数组类型的任何信息,比如当您只有对它的对象引用时

在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!");
    }
}
输出:

[[[1, 2, 3]null[4, 5]][]]

如果您想在java中的数组上使用迭代器,可以使用其中一种直接实现。例如:

Apache Commons Collections阵列迭代器

或者,这个,如果你想使用泛型:

com.Ostermiller.util.ArrayIterator


请注意,如果您想要在基本类型上使用迭代器,则不能,因为基本类型不能是泛型参数。例如,如果您想要迭代器,则必须使用迭代器,这将导致大量的自动装箱和-取消装箱(如果有int[]支持)。

a)选择一种语言;它们不完全相同。B)展示你的想法,请告诉面试官他问了个问题,你学习过C++和java吗?
int[][][] arr = { { { 1, 2, 3 }, null, { 4, 5 } }, {} };
printElements(arr);
[[[1, 2, 3]null[4, 5]][]]