将金字塔中的值存储为锯齿状数组

时间:2014-04-09 23:52:02

标签: java jagged-arrays

这是我的代码:

ArrayList<ArrayList<Integer>> nums = new ArrayList<>();
    int index = 0;
    for(int i = 0; i < 15; i++){
        nums.add(new ArrayList<Integer>());
        int j = 0;
        while(!(j > i)){
            if(Character.isDigit(pyramid.charAt(index))){
                String s = "" + pyramid.charAt(index) + pyramid.charAt(index + 1);
                int c = Integer.parseInt(s);
                nums.get(i).add(c);
                j++;
                index++;
            }
            index++;
        }
    }

&#39;金字塔&#39;是一个包含十五行数字金字塔的字符串(顶行有一个数字,下一行有两个数字等)。这样做,我得到一个锯齿状的ArrayList。

我的问题是如何以数组形式完成此操作?我能想到在他们自己的数组中获取所有数字的唯一方法是制作一个15个数组长的2D数组,每个数组中有15个点。因为我不会使用每个数组的每个索引(我只使用最后一个的每个索引),所以有点浪费。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

你可以通过两次字符串。第一次,弄清楚你需要多少个数组元素(看起来你可以计算pyramid中的数字,但是当count到达i时停止,或类似的那样)。然后执行arr[i] = new Integer[count];之类的操作,再次遍历字符串以设置元素。

答案 1 :(得分:1)

如果你真的想要初始化2D锯齿状数组,你可以这样做:

 public static void main( String [] args){
   int [][] jaggedArray = new int [15][];
   for (int i=0; i<15; i++){
     jaggedArray[i] = new int[i+1];
 } 

但是,在问题中,如果字符串中的字符是数字并动态添加,则在运行时检查它。 ArrayLists与Arrays的问题在于前者允许您动态更改大小,而后者则不能。所以你要么:

  • 提前了解静态大小并按照上面的方式进行初始化
  • 浏览字符串并确定其他人所说的静态大小,然后将其初始化
  • 否则,您需要使用允许动态调整大小的数据结构

另外,我不确定应用程序,但如果你保证这个东西不会超过15x15,我不会过分担心过度分配。

答案 2 :(得分:0)

如果你有一个高度为n的金字塔,你只需要一个size (n)(n+1)/2数组来存储它。因此,如果您的金字塔高度为10个元素,则需要(10 * 11/2)55个元素来存储所有值。

因此,如果您想知道金字塔中任意元素的位置,您只需求解n的等式,即可得到:

n=sqrt(2i+0.25)-0.5

这个等式似乎是愚蠢的,但它是正确的。

所以数组中的位置3920在金字塔中给出了n = 88.04518620455886。我们围绕这个,所以第88行,从指数3916(88 * 89/2)开始。

3920 - 3916 = 4.

所以i = 3920是第88行的第4个指数。

pyramidsize(n) = (n * (n + 1)) / 2;

pyramid(r,x) = array[(r*(r+1))/2 + x];

row(i) = (int)Math.floor(Math.sqrt(2*i+0.25d)-0.5d);

indexinrow = pyramidsize(row(i)) - i;

尽管如此,大多数情况下你只是在迭代金字塔而不是查找金字塔来进行数组转换,这意味着你可以真正将它们添加到arraylist或预定义数组(基于所需的大小)并循环遍历它们,但你可以将它们全部存储在数组中,并通过一些计算查找确切的所需位置。