2016-12-09 5 views
2

Im пытается сортировать по массиву сложены кубов. Массив выглядит следующим образом (пример)Как правильно отсортировать этот массив?

Nth Cube | Position (0, its on the desk, >0, its on another cube) 
--- 
1|6 
--- 
2|8 
--- 
3|0 
--- 
4|0 
--- 
5|0 
--- 
6|0 
--- 
7|1 
--- 
8|4 
--- 

, который будет выглядеть следующим образом визуализируется

[7] [2] 
--- 
[1] [8] 
--- 
[6] [4] [3] [5] 
--- 

Я выяснял кубов, которые находятся на другой:

строка [,] t в этом случае представляет собой весь массив

static string[,] stackedCubes(string[,] t) 
    { 
     string[,] stackedHelp = new string[NumberOfStacked(),2]; 
     int j = 0; 
     for (int i = 0; i < t.GetLength(0); i++) 
     { 
      if (t[i, 1]!="0") 
      { 

       stackedHelp[j, 0] = t[i, 0]; 
       stackedHelp[j, 1] = t[i, 1]; 
       j++; 
      } 
     } 
     return stackedHelp; 
    } 

, который выходит как:

1|6 
--- 
2|8 
--- 
7|1 
--- 
8|4 
--- 

теперь им пытаются поставить их сверху вниз (так 7/2 затем 1/8)

строка [,] т здесь на это stackedCubes

static string[,] Putdown(string[,] t) 
    { 
     string[,] stackedOrder = new string[NumberOfStacked(), 2]; 
     int j = 0; 
     do 
     { 
      for (int i = 0; i < t.GetLength(0); i++) 
      { 
       if (t[i, 1] == t[j, 0]) 
       { 
        j = i; 
       } 
       else if(IsSomethingOnTheCube(t[j,0],t)==false) 
       { 
        stackedOrder[i, 0] = t[j, 0]; 
        stackedOrder[i, 1] = "0"; 
        t[i, 1] = "0"; 
       } 
      } 
     } 
     while (AreAllTheCubesOnTable(t) != true); 

     return stackedOrder; 
    } 

здесь им будет от первого куба 1 (т [у, 0]) и проверьте, есть ли что-то на нем, он находит его на т [я, 1] и возвращает в 7 (т [ j, 0]) и возвращается. проверить, если есть что-то на кубе здесь

static bool IsSomethingOnTheCube(string Cube,string[,] t) 
    { 
     for (int i = 0; i < t.GetLength(0); i++) 
     { 
      if(Cube==t[i,1]) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

Я также проверить, действительно ли все они на столе (с сделай время)

static bool AreAllTheCubesOnTable(string[,] t) 
    { 
     for (int i = 0; i < t.GetLength(0); i++) 
     { 
      if (t[i, 1] != "0") 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

И выход все неправильно :

7|0 
--- 
7|0 
--- 
7|0 
--- 
7|0 
--- 

, когда это должно быть что-то вроде:

7|0 
--- 
1|0 
--- 
2|0 
--- 
8|0 
--- 

Где я индексировать не так? (Или что-то еще)

+0

Каков ваш ожидаемый результат (7 | 0, 1 | 0, 2 | 0, 8 | 0), которые должны представлять? – EpicSam

+0

возвращаемое значение Putdown() - которое является строкой [,] stackedOrder - когда все это сделано – throwjdoe

+1

Ваше использование языка домена в вопросе запутанно; «куб», находящийся «на столе» или «на другом кубе», абсолютно ничего не значит для людей вне вашего мозга или за пределами тех, кто знает. Говорите в простом коде. – eurotrash

ответ

0

В образце при условии

string[] cubes = new string[] 
    {"1|6", "2|8", "3|0", "4|0", "5|0", "6|0", "7|1", "8|4"}; 

Суть в вопросе выглядит как случайный один. Давайте заказывать низкие кубики (скажем, лексикографически), и поэтому визуализация будет:

lines: 
    2:  [2]  [7] 
    1:  [8]  [1] 
    0: [3] [4] [5] [6] <- bottom line is sorted 
------------------------ 
files: 0 1 2 3 

Сделав это, мы можем реализовать два методы помогают:

// Line: 0 for lowest cubes 
    private static int CubeLine(string value, IEnumerable<String> stack) { 
     for (int line = 0; ; ++line) { 
     string parent = value.Substring(value.IndexOf('|') + 1); 

     if ("0".Equals(parent)) 
      return line; 

     value = stack.First(item => item.StartsWith(parent + "|")); 
     } 
    } 

И

// File: 0 for leftmost cubes 
    private static int CubeFile(string value, IEnumerable<String> stack) { 
     string root = value; 

     while (true) { 
     string parent = root.Substring(root.IndexOf('|') + 1); 

     if ("0".Equals(parent)) 
      break; 

     root = stack.First(item => item.StartsWith(parent + "|")); 
     } 

     return stack 
     .Where(item => item.Substring(value.IndexOf('|') + 1) == "0") 
     .OrderBy(item => item) 
     .Select((item, index) => new { 
      item = item, 
      index = index 
     }) 
     .First(item => item.item == root) 
     .index; 
    } 

И тогда вы можете легко отсортировать все, что захотите.Например, давайте разберёмся верхние кубики первым, в случае равенства крайнего левого первого:

string[] cubes = new string[] 
    {"1|6", "2|8", "3|0", "4|0", "5|0", "6|0", "7|1", "8|4"}; 

    var result = cubes 
    .Select (cube => new { 
     name = cube.Substring(0, cube.IndexOf('|')), 
     file = CubeFile(cube, cubes), 
     line = CubeLine(cube, cubes) }) 
    .OrderByDescending(cube => cube.line) 
    .ThenBy(cube => cube.file) 
    .Select(cube => cube.name); 

    Console.Write(string.Join(", ", result)); 

результат

2, 7, 8, 1, 3, 4, 5, 6 

Edit: если вы хотите, чтобы отсортировать слева направо первой, сверху вниз на галстуке:

var result = cubes 
    .Select (cube => new { 
     name = cube.Substring(0, cube.IndexOf('|')), 
     file = CubeFile(cube, cubes), 
     line = CubeLine(cube, cubes) }) 
    .OrderBy(cube => cube.file) 
    .ThenByDescending(cube => cube.line) 
    .Select(cube => cube.name); 

И результат

3, 2, 8, 4, 5, 7, 1, 6 

Edit 2: Положи порядок: снизу первых, галстуки произвольные

var result = cubes 
    .Select (cube => new { 
     name = cube.Substring(0, cube.IndexOf('|')), 
     file = CubeFile(cube, cubes), 
     line = CubeLine(cube, cubes) }) 
    .OrderBy(cube => cube.line) 
    .Select(cube => cube.name); 

Результат:

3, 4, 5, 6, 1, 8, 2, 7 
+0

Ожидаемый результат в вопросе дает упорядочение 7 -> 1, которое дает визуализацию, означает вертикальный порядок. Ваш ответ дает горизонтальный порядок. – EpicSam

+0

@EpicSam: имея 'CubeFile' и' CubeLine', вы можете легко отсортировать массив по мере необходимости. См. Мое редактирование. –

+0

oh boy, где я начинаю, сначала спасибо за то, что вы нашли время, задавая вопрос, однако, так как я только начал изучать программирование в последнее время, я не могу сделать что-либо из кода, который вы там поставили, и перевести на мой succesfuly (я пытался, когда он мог бы построить его output system.linq ...), также мне действительно нужна помощь с отсортированным массивом stackedCubes(), когда я пытаюсь Putdown() их сверху, как показано в ожидаемых результатах – throwjdoe

0

Хотя многомерные массивы используются в многочисленных примерах при запуске программ, с использованием массива типично типизированных классов, как правило, целесообразно. Тем не менее, когда многомерный массив все еще может быть проанализирован в другом формате, таком как словарь. Например:

string[,] cubes = {{"1","6"} ,{ "2","8"} ,{ "3","0"} ,{ "4","0"} ,{ "5","0"} ,{ "6","0"} ,{ "7","1"} ,{ "8","4"}}; 


//create a dictionary of all cube-parents 
var parents = (from i in Enumerable.Range(0, cubes.GetLength(0))      
       group cubes[i,0] by cubes[i,1]) 
       .ToDictionary(g=>g.Key, g=>g.ToArray());  

var layer = parents["0"]; //table level cubes [3,4,5,6] 
var layers= new List<string[]>(); 
while(layer != null){ 
    layers.Add(layer); 
    string[] children, nextlayer = null; 
    for(int i = 0; i < layer.Length; i++) 
     if(layer[i] != null && parents.TryGetValue(layer[i], out children)){ 
      if(nextlayer==null)nextlayer= new string[layer.Length]; 
      nextlayer[i] = children[0]; //what to do with multiple children? 
     } 
    layer= nextlayer; 
}; 

Когда выше закончена, layers содержит {[3,4,5,6],[null,8,null,1], [null,2,null,7]} Другими словами, несколько слоев. Я не совсем уверен, какой желаемый конечный результат. Является ли это визуальным представлением или чем-то вроде всех кубов не на таблице (для последнего это просто все элементы, у которых нет родительского «0»)

Смежные вопросы