有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:通用静态多维数组

如果可能,我如何在Java中创建一个静态多维数组,每个维度具有不同的基本数据类型

所谓静态,我指的是不像ArrayList那样是动态的基本数组


共 (5) 个答案

  1. # 1 楼答案

    数组中的维度总是从int类型开始。想想看

    int a = 4;
    int b = 5;
    
    Shoe shoe = new Shoe (Color.RED, 42, "Leather");
    Hat hat = new Hat (17, Color.Black);
    
    Foo foo = foos[a][b];
    Zilch pop = bars[shoe][hat]; // no go
    

    如果有一个多维的Foo数组,第一个维度是Foo,第二个维度是Foo数组,第三个维度是Foo数组。唯一的变量类型是底部的变量类型

    更新问题后编辑:

    数组不称为静态数组或基元数组。它们的大小在初始化时是固定的,它们与原语的共同点是,它们是一个构建,在某些情况下会受到特殊的威胁。它们是-与所谓的基元类型不同,基元类型不是基元类型(例如,它们有专门用于自身的运算符,如* / -),但同时它们是对象,但不在库中声明

    叫他们build in-types

    使用贝什·古隆的技巧:

    Object[] arr = {new Integer[]{}, new String[]{}, new Double[]{}}; 
    

    它不是由每个维度的不同数据类型组成的。让我们从尺寸开始:

    // One-dimensional object:
    JPanel [] panels = new JPanel [3]; 
    // Two-dimensional object:
    JPanel [][] panels = new JPanel [3][10]; 
    

    底层有JPanel,下一个维度有一个JPanel数组。您可以添加更多维度,并且将始终获得额外的(数组…)缠绕着

    不能在数组中混合不同的数据类型,如int和char、JPanel和JFrame、int和JButton。仅当您对差异进行抽象,并将JPanel和JFrame的JComponent用作公共父级时,但这对内置类型int、char、boolean等不起作用,因为它们不是对象

    但你们不能使用自动装箱,用整数代替整数,用字符代替字符,然后用对象作为公共父类吗?是的,你可以,但是你不再使用原语了,你在乞求麻烦

    Dan谈论的是另一件事-在多维数组中使用不同类型的索引:

    byte  b = 120;
    short s = 1000;
    String o [][] = new String[b][s];
    b = 7;
    s = 9;  
    o[b][s] = "foobar";
    String foo = o[b][s];
    

    使用byte或short没有问题,但是不能通过将数组声明为byte或short来限制数组的大小。在大多数情况下,内置整数类型的边界不适合数据类型(想想每年365天),尤其是因为所有类型都可能为负值,所以边界检查是必要的,尽管不能限制在编译时

    但现在麻烦来了:
    我们可以从一开始就将数组声明为二维:

    Object[][] ar2 = {
        new Integer [] {4, 5, 6}, 
        new String [] {"me", "and", "you"}, 
        new Character [] {'x', 'y', 'z'}};
    

    这样可以很好地工作,并且可以在不进行强制转换的情况下立即访问内部阵列。但只有编译器知道,元素是对象数组——底层类型被抽象掉了,因此我们可以写:

    ar2[1][1] = 17; // expected: String
    ar2[2][0] = "double you"; // expected: Char
    

    这将完美地编译,但你正在自食其果,并免费获得一个运行时异常

    以下是整个来源:

    public class ArrOfMixedArr
    {
        public static void main (String args[])
        {
            Object[] arr = {
                new Integer [] {1, 2, 3}, 
                new String [] {"you", "and", "me"}, 
                new Character [] {'a', 'b', 'c'}};
            show (arr);
            
            byte b = 7;
            short s = 9;
            String o [][] = new String[200][1000];
            o[b][s] = "foobar";
            String foo = o[b][s];
            
            Object[][] ar2 = {
                new Integer [] {4, 5, 6}, 
                new String [] {"me", "and", "you"}, 
                new Character [] {'x', 'y', 'z'}};
            show (ar2);
    
            // exeptions:
            ar2[1][1] = 17; // expected: String
            ar2[2][0] = "double you"; // expected: Char
        }
    
        public static void show (Object[] arr)
        {
            for (Object o : arr) 
            {
                if (o instanceof Object[])
                    show ((Object[]) o);
                else 
                    System.out.print (o.toString () + "\t");
            }
            System.out.println ();
        }
    }
    

    现在解决办法是什么? 如果您的基类型为数组(int、byte、char、String、JPanel等)如果长度相等,则有一个隐藏对象,即数据库行。改为使用类:

    class Shoe {
        byte size;
        String manufactor;
        java.math.BigDecimal price;
        java.awt.Color color;
    }
    
    Shoe [] shoes = new Shoe [7];
    

    如果没有相同大小的不同类型,它们可能是不相关的,不应该放在一个公共容器中

  2. # 2 楼答案

    嗯,你可以定义一个数组,一个数组。。。一个对象数组(嵌套的级别与维度的级别一样多),并在底部用不同的类型填充每个数组。。。然后,当您需要提取值时,将其转换为适当的类型。太多的工作是为了有价值的,真的。Java是一种静态类型的语言,不适合这类事情

    也许您应该重新考虑一下,为什么需要这样的数据结构

  3. # 3 楼答案

    您可以通过使用对象数组来获得效果:

    final static Object tryit[][] = {
            {'a',4},
            {'b',7},
            {'c',8},
    };
    @Test
    public void accessArray( ) {
        for (int i = 0; i < tryit.length ; i++) {
            char letter = (Character)tryit[i][0];
            int value = (Integer)tryit[i][1];
            System.out.println(letter + " has value " + value);
        }
    }
    

    “@Test”是JUnit符号

    注意:如果在数组中输入了错误的数据,这种方法在运行时会出现NullPointer和ClassCast异常

  4. # 4 楼答案

    经过一些测试,我有了一个简单的解决方案:

    Object [][] array = new Object [10][2];
    array[0][0] = 2;
    array[0][1] = false;
    
  5. # 5 楼答案

    你不能

    根据定义,多维数组是数组的数组。。。。关于某件事。因此,除了最后一个维度之外,其他维度都不能是数组。至少,按照传统的定义。但如果你说的“多维数组”是指其他东西,你需要告诉我们那是什么

    至于“static”,这是编程中的一个重载词,我能想到的每种语言都用它来表示稍微不同的意思。在Java中,static表示“属于某个类,而不是该类的实例。”再说一次,如果你这里的“静态”是指其他东西,你需要告诉我们这是什么

    编辑:正如最初发布的那样,这个问题没有包括“原始”一词。这改变了一点。事实上,我同意,从方便的角度来看,如果Java允许数组通过char或甚至一个enum而不仅仅是int进行索引,那将是一件好事。但事实并非如此