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

时间:2015-10-16 06:00:52

标签: java android

我的问题与所讨论的错误消息有关,例如在这里:The code for the static initializer is exceeding the 65535 bytes limit error in java?

在一个类中,我需要一个具有大约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 ...
}

第二种解决方案有效,但显然存在一些缺点:

  1. 我必须知道行数并明确枚举它们
  2. 在源头中排列得不那么整齐
  3. Java中有更优雅的方式来初始化数据吗?

2 个答案:

答案 0 :(得分:1)

我使用8000整数进行了测试并编译(Java 7和8)。

static List<short[]> a = new ArrayList<>();
static void add( int... row ){
    short[] srow = new short[row.length];
    for(int i = 0; i < row.length; ++i ){ srow[i] = (short)row[i]; }
    a.add( srow );
}
static {
   add(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19);
   add(...)
}

您可以从列表中选择一个简短的[] []。

虽然使用List<List<Integer>>应该不是问题。写一个x.get(i,j)并不比[i,j]更不方便 - 你只需要一个包含list和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);

为方便访问,只需使用

即可
class TwoDim {
    static List<List<Integer>> a = ...
    static int get(int i, int j){ return a.get(i).get(j); }
}

答案 1 :(得分:1)

是的,有。

Java ArrayList一个动态数组,当您添加项目时,该数组的大小会增加。那么size?忘掉它。

我如何在我的情况下使用它?

    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中创建二维数组。

这是一种简单的技术。

创建ArrayList()

类型的ArrayList()
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));