2016-03-05 86 views
1

我在本mainArray(动态生成的):如何在独特阵列动态拆分阵列

static void Main() 
{ 
    var n = 3; 
    var k = 2; 
    var a = n * k; 
    var mainArray = new int[a]; 
    var index = 0; 
    for (var i = 0; i < n; i++) 
    { 
     for (var j = 0; j < k; j++) 
     { 
      mainArray[index] = i; 
      index++; 
     } 
    } 

    //=> mainArray=[0,0,1,1,2,2] 
    // How to split this array in 3 uniq arrays, like: 
    //array1=[0,1] 
    //array2=[1,2] 
    //array3=[0,2] 

    Console.WriteLine(String.Join(",", mainArray)); 
    Console.ReadLine(); 
} 

mainArray = [0,0,1,1,2,2]

如何分割这阵列中的3个uniq的阵列,如:

ARRAY1 = [0,1]

数组2 = [1,2]

ARRAY3 = [0,2]

我该怎么办?

+0

[0,0] [1,1],[2,2] =不uniq的; [0,1],[0,1] [2,2] =不是uniq; ,唯一的可能性是我的问题; –

回答

1

所以最初你有一组n * k项目,其中每个值重复kn不同的值。并且您希望以这样的方式将这些n * k项目排列在k集合中,使得结果集合中的每个值都是唯一的。

你可以做到这一点通过以下方式

int[][] res = Enumerable.Range(0, n).Select(x => new int[k]).ToArray(); 
for(int i = 0; i < n; i++) 
    for(int j = 0; j < k; j++) 
     res[i][j] = (i + j) % n; 
0

你的意思是说所有的数组在每个数组中必须有不同的数字,或者每个数组必须是唯一的数组?

如果您只想创建具有唯一编号的数组,请尝试以下操作。我确信有更好的解决方案,但我相当肯定这可能适合您的情况。

public static int[][] splitUnique(int[] input, int length) 
    { 
     if (input.Length % length != 0) throw new Exception("Length cannot yield full arrays of length " + length); 
     List<int> numbers = new List<int>(input); 
     int[][] data = new int[input.Length/length][]; 
     int dataIndex = 0; 
     while (numbers.Count != 0) 
     { 
      int[] temp = new int[length]; 
      int tempIndex = 0; 
      foreach (int num in numbers) 
      { 
       if (!temp.Contains(num)) 
       { 
        temp[tempIndex] = num; 
        tempIndex++; 
       } 
       if (tempIndex >= length) 
       { 
        break; 
       } 
      } 
      foreach (int num in temp) 
      { 
       numbers.Remove(num); 
      } 
      data[dataIndex] = temp; 
      dataIndex++; 
     } 
     return data; 
    }