如何在Java中优雅地初始化大型常量数组?

如何在Java中优雅地初始化大型常量数组?,java,android,Java,Android,我的问题与讨论的错误消息有关,例如: 在一个类中,我需要一个二维数组,其中包含大约4000个short常量,这些常量在不同的软件中进行了昂贵的预估计。我决定这样初始化它: private static final short[][] DataTable = { {32767,32767,32537,32260,31957}, {14485,14441,14393,14338,14277,14210,14135,14052,13960}, // Many more line

我的问题与讨论的错误消息有关,例如:

在一个类中,我需要一个二维数组,其中包含大约4000个
short
常量,这些常量在不同的软件中进行了昂贵的预估计。我决定这样初始化它:

private static final short[][] DataTable = {
    {32767,32767,32537,32260,31957},
    {14485,14441,14393,14338,14277,14210,14135,14052,13960},
    // Many more lines here ...
    {   60,   67,   75,   84,   95,  106,  119,  133}
}
但由于上述错误,这是不可能的。所以在stackoverflow搜索之后,我找到了上面的问题。受答案的启发,我将代码更改为:

private static final short[][] DataTable = new short[180][];
static {
    initializeA();
    initializeB();
}
private static void initializeA() {
    DataTable[0] = new short[]{32767,32767,32537,32260,31957};
    DataTable[1] = new short[]{14485,14441,14393,14338,14277,14210,14135,14052,13960};
    // Many more lines here ...
}
private static void initializeB() {
    DataTable[138] = new short[]{   60,   67,   75,   84,   95,  106,  119,  133};
    // Many more lines follow ...
}
第二种解决方案可行,但显然存在一些缺点:

  • 我必须知道行数并明确地列举它们
  • 它在源代码中的排列不太整齐

  • 在Java中有没有更优雅的方法来初始化数据?我已经用8000个整数测试了它,并编译了它(Java 7和8)

    static List a=new ArrayList();
    静态无效添加(int…行){
    short[]srow=新的short[row.length];
    对于(inti=0;i
    您可以从列表中选择一个简短的[]

    尽管如此,使用
    List
    应该不会有问题。一个x.get(i,j)编写起来并不比一个[i,j]麻烦多少——您只需要一个包含列表和get方法的最小类包装器

    这还汇编了:

    static List<List<Integer>> a = new ArrayList<>();
    static void add( Integer... row ){
         a.add( Arrays.asList( row ) );
    }
    static {
        add(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
    
    static List a=new ArrayList();
    静态空添加(整数…行){
    a、 添加(Arrays.asList(row));
    }
    静止的{
    添加(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
    
    为了便于访问,只需使用

    class TwoDim {
        static List<List<Integer>> a = ...
        static int get(int i, int j){ return a.get(i).get(j); }
    }
    
    classtwodim{
    静态列表a=。。。
    静态int-get(inti,intj){返回a.get(i).get(j);}
    }
    
    是的,有

    Java
    ArrayList
    一个动态数组,当您添加项时,它的大小会不断增加。所以
    大小
    就不用管它了

    我如何在我的案例中使用它

        ArrayList<Integer> list1 = new ArrayList(Arrays.asList(32767, 32767, 32537, 32260, 31957));
        ArrayList<Integer> list2 = new ArrayList(
                Arrays.asList(14485, 14441, 14393, 14338, 14277, 14210, 14135, 14052, 13960));
    
        System.out.println(list1 + " " + list1.size());
        System.out.println(list2 + " " + list2.size());
    
    arraylistlist1=新的ArrayList(Arrays.asList(32767、32767、32537、32260、31957));
    ArrayList list2=新的ArrayList(
    asList(1448514441143931433814277142101141351405213960);
    System.out.println(list1+“”+list1.size());
    System.out.println(list2+“”+list2.size());
    

    如何在ArrayList中创建二维数组

    有一种简单的方法可以做到这一点

    创建ArrayList()类型的ArrayList()

    ArrayList列表2=新建ArrayList(
    asList(1448514441143931433814277142101141351405213960);
    ArrayList myList=新的ArrayList();
    myList.add(列表1);
    myList.add(列表2);
    对于(int i=0;i
    为什么不使用
    ArrayList类
    ?从文件中加载数据?从其他软件中获取预估计值的格式是什么?正如@oraclecertifiedprofessional建议的,尝试从文件中读取它们,而不是在类文件中硬编码值。这些值如何分布在不同的子数组中?看起来y有不同的长度。@redsymbolman如果可以很容易地将输出格式化为Java代码,那么就采用类似于laune的解决方案。
    列表
    确保了一维的动态长度,
    short[]
    的大小由
    添加(1,2,3…)中的值定义
    line。谢谢。你的例子并不适合我在问题中提出的二维案例。我也不知道如何将它转移到我的案例中。你能帮我举一个二维的例子吗?另外,访问也很有趣。在我的案例中,它只是
    DataTable[I][j]
    @redsymbolman我更新了答案,以便您可以使用二维表示。请看一看,并告诉我这是否是您想要的。谢谢。然后选择获得上述错误所需的大小。我还没有使用Java 8。您的解决方案确实更优雅。
        ArrayList<Integer> list1 = new ArrayList(Arrays.asList(32767, 32767, 32537, 32260, 31957));
        ArrayList<Integer> list2 = new ArrayList(
                Arrays.asList(14485, 14441, 14393, 14338, 14277, 14210, 14135, 14052, 13960));
    
        System.out.println(list1 + " " + list1.size());
        System.out.println(list2 + " " + list2.size());
    
    ArrayList<Integer> list2 = new ArrayList(
                Arrays.asList(14485, 14441, 14393, 14338, 14277, 14210, 14135, 14052, 13960));
    ArrayList<ArrayList<Integer>> myList = new ArrayList();
    myList.add(list1);
    myList.add(list2);
    
    for (int i = 0; i < myList.size(); ++i)
        for (int j = 0; j < myList.get(i).size(); ++j)
            System.out.println(i + " " + j + " " + myList.get(i).get(j));