2012-02-07 3 views
5

У меня есть довольно уникальная проблема, с которой у меня возникают проблемы. У меня есть таблица 2 x 3, расположенная, как показано ниже.Сложный алгоритм слияния javascript и jquery

        _ __ _ _ __
1- | _ __ _ | __ _ _ |
2- | _ __ _ | __ _ _ |
3- | _ __ _ | __ _ _ |

Данные заселяются в ячейки таблицы. Иногда данные в столбце или строке могут быть одинаковыми. Например, если (1,1) и (1,2) имеют одинаковые данные. В некоторых случаях (1,1), (1,2) и (1,3) могут иметь одинаковые данные. Если значения в ячейках одинаковые и смежные, их необходимо объединить. Например, если (1,1) и (1,2) оба имеют значение «100», две ячейки объединяются. Я сделал это вручную, с помощью JQuery, как:

(1,2).hide(); 
(1,1).attr("rowspan", "2"); 

Я скрываю (1,2) клетки вместо удаления, поскольку таблицы могут быть сброшены к первоначальному 2х3, а затем заселили в случае необходимости. В ручном режиме это отлично работает, но мне нужен динамический метод. Ниже приведена общая цель того, что необходимо выполнить.

  • Если две вертикально смежные ячейки или три вертикально смежные ячейки в своих соответствующих столбцах имеют значения, равные, то эти ячейки объединяются вместе.
  • Ячейки строк, такие как (1,1) и (2,1), могут иметь дублированные данные и никогда не сливаются.
  • Для сравнения, группы ячеек, которые могут быть объединены, являются {(1,1), (1,2)}, {(1,1), (1,2), (1,3)} , ((1,2), (1,3)}, {(2,1), (2,2)}, {(2,1), (2,2), (2,3)}, { (2,2), (2,3)}
  • Несколько объединений могут происходить одновременно. Например: {(1,1), (1,2)} имеют одинаковые данные, а {(2,1), (2,2), (2,3)} имеют одинаковые данные. Обе группы объединены индивидуально.

Мой главный вопрос: как я могу написать алгоритм для этого, не выписывая каждую возможную ситуацию. Может ли кто-нибудь показать мне пример того, что будет работать? Я понимаю, что это сложно, поэтому не стесняйтесь задавать вопросы для разъяснения. Большое спасибо за продвинутый. Это огромная помощь!

+0

Всегда ли таблица 2x3? –

+0

Звучит как работа для ... Карно Картография. См. Http://en.wikipedia.org/wiki/Karnaugh_map –

+0

Таблица всегда изначально 2 x 3. Слияние ячеек может привести к тому, что таблица станет 2 x 2 или 2 x 1. – dremme

ответ

3

Нравится? http://jsfiddle.net/4zGvg/ Работает с произвольными строками/столбцами.

Идея: у нас есть values матрица и span матрица. Значения span являются

0 = скрыть эту ячейку

1 = нормальная клетка

х> 1 = клетки с RowSpan х

итерацию по столбцам в прямом порядке и по строкам в обратном порядке , Если значение какого-то ячейки равно значению ниже его, увеличение этой ячейки span и удалить span из следующей ячейки:

for (var col = 0; col < cols; col++) { 
    for (var row = rows - 2; row >= 0; row--) { 
     if (values[row][col] == values[row + 1][col]) { 
      span[row][col] = span[row + 1][col] + 1; 
      span[row + 1][col] = 0; 
     } 
    } 
} 

Как только это будет сделано, вы можете использовать span для создания полной таблицы или показать/скрыть ячейки и установить атрибуты rowspan.

+0

Очень круто. Лучший ответ, который я нашел. Я попытаюсь реализовать это решение. Благодарю. – dremme

2

Поскольку это всегда 2x3, вы могли бы просто наброситься на него.

http://jsfiddle.net/Csxbf/

var $cells = $("td"); 

if ($cells.eq(0).text() == $cells.eq(2).text()) { 

    if ($cells.eq(2).text() == $cells.eq(4).text()) { 
     $cells.eq(2).hide(); 
     $cells.eq(4).hide(); 
     $cells.eq(0).attr("rowspan",3); 
    } else { 
     $cells.eq(2).hide(); 
     $cells.eq(0).attr("rowspan",2); 
    } 

} else if ($cells.eq(2).text() == $cells.eq(4).text()) { 
    $cells.eq(4).hide(); 
    $cells.eq(2).attr("rowspan",2); 
} 

Это определенно может быть оптимизирована, это просто быстрый и грязный. Вы определенно хотели бы сохранить ссылки на ячейки и не звонить eq столько раз. Вам нужно будет сделать то же самое для второго столбца.

Если таблица может изменять размеры, вам нужно будет перебрать каждую ячейку в столбце и для каждого выбранного диапазона, скрыть совпадения и установить rowspan. Относительно легко, но на самом деле не нужно здесь.

+0

У меня на самом деле есть версия bruteforced, которая отлично работает. Я надеялся его оптимизировать. – dremme

+0

Для небольшой статической таблицы bruteforce будет оптимальной по производительности. Что-то более динамичное просто добавит накладные расходы. –

+0

Я понимаю. Я доволен кодом, который я уже написал. Моя причина для публикации это просто мое любопытство за дополнительными решениями. Спасибо за ваш ответ. – dremme

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