我们如何访问多维数组

3

我们如何在不知道多维数组的情况下访问它!例如:

Object[][] inputs = { new Object[] { "a", "ab", "abc" },
            new Object[] { "abc", "ab", "a" },
            new Object[] { "big", new Object[] { "ab", "a", }, "t" },
            new Object[] { "big", new Object[] { "ab", "a", new Object[] { "superbig", "a" } }, "tiny" },
            new Object[] { 123, 23123123, "a" },
            new Object[] { null, new Object[] {}, "a" } };

我原以为这是一个二维数组,但它并不是2(我对Java的语法感到不满意),我需要获得所有输入数组对象的信息。我该怎么解决呢?有没有将多维数组转换为一维数组的方法?
附注:输出应为 { abc, abc, big,superbig,23123123,a} (它是对象每行中最大的字符串!)

假设您在不知情的情况下成功访问了数组。 您想对它们做什么? 打印它们的内容吗? - Chetan Kinger
可能是类似于"arrayutils.flatten"的东西——可以看看commons库。 - vikingsteve
我特别想得到第一维度每个位置上最长的字符串!例如:输出应该是 {abc,abc,big,superbig,23123123,a}。 - Damiii
我编辑了我的答案,向您展示如何使用方法 toSingleDimension 来查找最长的字符串,输出现在应该是您想要的。 - peenut
2个回答

3

您可以使用反射在运行时轻松将任何维数组压缩为单一维度。您可以使用它来计算所需的最长字符串。

以下是可运行的示例程序:

import java.lang.reflect.*;
import java.util.*;

public class Program {

    private static Object[] toSingleDimension(Object array) {
        ArrayList<Object> arrayList = new ArrayList<>();
        toSingleDimensionRecursive(arrayList, array);
        return arrayList.toArray();
    }

    private static void toSingleDimensionRecursive(ArrayList<Object> output, Object object) {
        if (object == null) {
            output.add(null);
        } else if (!object.getClass().isArray()) {
            output.add(object);
        } else {
            int length = Array.getLength(object);
            for (int i = 0; i < length; ++i) {
                Object value = Array.get(object, i);
                toSingleDimensionRecursive(output, value);
            }
        }
    }

    private static String findLongestString(Object[] array) {
        if (array == null) {
            return null;
        }
        String result = null;
        for (Object object : array) {
            if (object != null) {
                String text = object.toString();
                if (result == null) {
                    result = text;
                } else if (text != null && text.length() > result.length()) {
                    result = text;
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        Object[][] inputs = {new Object[]{"a", "ab", "abc"},
            new Object[]{"abc", "ab", "a"},
            new Object[]{"big", new Object[]{"ab", "a",}, "t"},
            new Object[]{"big", new Object[]{"ab", "a", new Object[]{"superbig", "a"}}, "tiny"},
            new Object[]{123, 23123123, "a"},
            new Object[]{null, new Object[]{}, "a"}};

//      Object[] data = toSingleDimension(inputs);
//      System.out.println(Arrays.asList(data));

        ArrayList<String> longestStrings = new ArrayList<>();
        for (Object input : inputs) {
            Object[] array = toSingleDimension(input);
            String longest = findLongestString(array);
            if (longest != null) {
                longestStrings.add(longest);
            }
        }
        System.out.println("Longest strings of arrays: " + longestStrings);
    }
}

输出:

Longest strings of arrays: [abc, abc, big, superbig, 23123123, a]

非常感谢! :) - Damiii

2
你可以使用递归轻松实现这一点。
public List<Object> convert(Object input) {
    List<Object> objectList = new ArrayList<>();
    if (input instanceof Object[]) {
        for (Object object : (Object[]) input) {
            objectList.addAll(convert(object)); // Instead of addAll here, just add max element. I am a little too lazy to implement that...:)
        }
    } else {
        objectList.add(input);
    }
    return objectList;
}

明智的决定使用 ArrayList。加一。话虽如此,这仅在内部数组全部为 Object 数组时才有效。不确定是否总是如此。 - Chetan Kinger
@Chetan 我认为任何数组都是对象数组..是吗?当然,如果我们使用Collections代替数组的话就行不通了。 - Codebender
int[] 不是一个对象数组,例如。 - Steffen
@AbishekManoharan 我的错。我想说的是如果所有内部对象都是 array 类型的引用。这应该适用于包括基本类型在内的所有类型的内部数组。 - Chetan Kinger
啊...是的,如果一个原始数组是通过特定的方式创建的,比如使用new int[]{},那么它是行不通的... - Codebender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接