使用分隔符将二维数组划分为多个数组

Posted

技术标签:

【中文标题】使用分隔符将二维数组划分为多个数组【英文标题】:Divide a 2D array into multiple arrays using a separator 【发布时间】:2013-01-08 13:39:12 【问题描述】:

我已将 javascript spritesheet 转换为 2D 整数数组,现在我尝试将 2D 整数数组拆分为多个 2D 数组,使用 1 作为“分隔符”数字。

有没有什么办法可以使用分隔号将如下所示的 2D JavaScript 数组分隔成多个数组,如下所示?

function separate2DArray(arrToSeparate, separator)
    //separate the 2D array into multiple 2D arrays, using a
    //specific number as the separator


//array to separate:
[
[5, 5, 5, 1, 5, 4, 5],
[5, 5, 4, 1, 4, 3, 4],
[1, 1, 1, 1, 1, 1, 1], //1 is the "separator number", which splits the array
[9, 2, 1, 4, 2, 4, 5],       //horizontally and vertically
]
//The array above would produce the following 2D arrays:

5 5 5
5 5 4

5 4 5
4 3 4

9 2

4 2 4 5

我想到的这个算法的主要应用是spritesheet图像分离。

【问题讨论】:

是的,肯定有。 所以...您想在找到 1 时创建一个新数组? @JesseJ:不,将二维数组视为地图。那些是墙,他想得到房间。 @BergI 这正是我想要做的。 :) 我添加了一个图像作为我正在使用的图像布局的示例。 @JustinBicknell:不,你的做法不同 【参考方案1】:

鉴于分隔区域是矩形的,这将起作用:

function separate2DArray(array, sep)
    //separate the 2D array into multiple 2D arrays, using a
    //specific number as the separator
    var result = [],
        currentSubs = ; // using x coordinate as key

    for (var y=0; y<array.length; y++) 
        var line = array[y],
            subBegin = 0;
        for (var x=0; x<=line.length; x++) 
            if (x == line.length || line[x] == sep) 
                if (subBegin < x) 
                    var sub = line.slice(subBegin, x);
                    if (subBegin in currentSubs)
                        currentSubs[subBegin].push(sub);
                    else
                        currentSubs[subBegin] = [sub];
                 else  // a line of separators, subBegin == x
                    if (subBegin in currentSubs) 
                        result.push(currentSubs[subBegin]);
                        delete currentSubs[subBegin];
                    
                
                subBegin = x+1;
            
        
    
    for (var begin in currentSubs)
        result.push(currentSubs[begin]);
    return result;

这里的结果只是一个非常简单的子区域数组,没有关于它们在原始区域中的位置的任何信息。改进版:

function separate2DArray(array, sep)
    var result = [],
        currentSubs = ;
    for (var y=0; y<array.length; y++) 
        var line = array[y],
            subBegin = 0;
        for (var x=0; x<=line.length; x++) 
            if (x == line.length || line[x] == sep) 
                if (subBegin < x) 
                    var subline = line.slice(subBegin, x);
                    if (! (subBegin in currentSubs)) 
                        var subarea = [];
                        result.push(x:x, y:y, area:subarea);
                        currentSubs[subBegin] = subarea;
                    
                    currentSubs[subBegin].push(subline);
                 else 
                    if (subBegin in currentSubs)
                        delete currentSubs[subBegin];
                
                subBegin = x+1;
            
        
    
    return result;

【讨论】:

另外,这里是 JSFiddle 上的原始版本:jsfiddle.net/jarble/cWYpr/12【参考方案2】:

您必须遍历数组,每当找到 1 时将预览条目捕获到子数组中

http://jsfiddle.net/cWYpr/10/

 var arr = [[5, 5, 5, 1, 5, 4, 5], [5, 5, 4, 1, 4, 3, 4], [1, 1, 1, 1, 1, 1, 1], [9, 2, 1, 4, 2, 4, 5]];
  var twoD = [];
  for (var x = 0; x < arr.length; x++) 
    var row = arr[x];
    var subArray = [], subArrays=[];
    for (var y = 0; y < row.length; y++) 
      if (row[y] == 1) 
        if (subArray.length) subArrays.push(subArray.slice(0));
        subArray = [];
      
      else 
        subArray.push(row[y]);
      
    
    if (subArray.length) subArrays.push(subArray);
    if(subArrays.length) twoD.push(subArrays);
  
  console.log(twoD);
  document.write(JSON.stringify(twoD));

【讨论】:

程序输出中的第一个数组不正确 - 它应该是 [[5, 5, 5], [5, 5, 4]] 而不是 [[5, 5, 5], [5, 4, 5]] @AndersonGreen 我知道发生了什么,我没有垂直分割数组,只是水平分割

以上是关于使用分隔符将二维数组划分为多个数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将二维布尔数组转换为一维字节数组?

VBA批量导入文本文件,如何转换二维数组?

无法将制表符分隔的文件读入 numpy 二维数组

JAVA中如何创建一个二维数组,然后给二维数组赋值!

“拼接”多个二维数组

如何从仅使用空格作为分隔符的文件中获取要写入的二维数组