如何在Java中优雅地初始化大型常量数组?
我的问题与讨论的错误消息有关,例如: 在一个类中,我需要一个二维数组,其中包含大约4000个如何在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
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);}
}
是的,有
JavaArrayList
一个动态数组,当您添加项时,它的大小会不断增加。所以大小
就不用管它了
我如何在我的案例中使用它
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));