我的问题与所讨论的错误消息有关,例如在这里: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 ...
}
第二种解决方案有效,但显然存在一些缺点:
Java中有更优雅的方式来初始化数据吗?
答案 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));