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

时间:2013-07-13 21:10:52

标签: java c++ arrays loops multidimensional-array

我在接受采访时被要求打印长度和尺寸未知的阵列的所有元素。我找不到方法,但面试官说可以做到。任何人都能说出如何做到这一点?

5 个答案:

答案 0 :(得分:2)

在Java中,数组的大小始终是已知的。你不能在没有length的情况下创建数组,所以这个问题在Java中没有意义。

在C ++中,您要么知道长度,要么不知道。你不能处理一个你不知道长度的位置,但你可以解决它,因为那样你就会知道它的长度。他们可能意味着有一个像0这样的标记值,而不是存储为长度,但是一旦你找到这样的句子值,你就知道它的长度。

答案 1 :(得分:2)

这个问题在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);
}

答案 2 :(得分:2)

在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 ++中的问题,没有符合标准的方法,它不会调用未定义的行为来打印数组的元素,这些数组的大小通常与您用来打印的机制无法找到或无法找到它。打印元素需要您拥有或获取阵列长度的知识。

答案 3 :(得分:0)

我假设你没有关于数组类型的任何信息,比如你只有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]][]]

答案 4 :(得分:0)

如果你想在java中的数组上使用Iterator,你可以使用其中一个直接实现。例如:

Apache Commons Collections ArrayIterator

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

com.Ostermiller.util.ArrayIterator

请注意,如果您希望拥有Iterator,而不是原始类型,则不能,因为基本类型不能是通用参数。例如,如果你想要一个Iterator,你必须使用Iterator,这将导致大量的自动装箱和-unboxing,如果它由int []支持。