2012-02-07 9 views
5

Mam dość unikalny problem, który sprawia problemy. Mam stół 2 x 3, ułożony jak pokazano poniżej.Złożona tabela łącząca algorytm javascript i jquery

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

Dane są wypełniane w komórkach tabeli. Czasami dane w kolumnie lub wierszu mogą być takie same. Na przykład, jeśli (1,1) i (1,2) mają te same dane. W niektórych przypadkach (1,1), (1,2) i (1,3) wszystkie mogą mieć te same dane. Jeśli wartości w komórkach są takie same i sąsiadujące, muszą zostać scalone. Na przykład, jeśli (1,1) i (1,2) oba mają wartość "100", dwie komórki zostaną scalone. Robiłem to ręcznie za pomocą jquery jak:

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

ukryć (1,2) komórki zamiast usunięcie, ponieważ tabele można przywrócić do pierwotnego 2x3, a następnie odbudowane w razie potrzeby. Ręcznie, działa to świetnie, ale potrzebuję metody dynamicznej. Poniżej znajduje się ogólny cel tego, co należy osiągnąć.

  • Jeśli dwie sąsiednie pionowo komórki lub trzy pionowo sąsiadujące komórki w odpowiednich kolumnach mają równe wartości, wówczas te komórki są scalane razem.
  • Komórki wierszy, podobnie jak (1,1) i (2,1) mogą mieć zduplikowane dane i nigdy nie są scalane.
  • Dla odniesienia, grupy komórek, które mogą być połączone, to {(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)}
  • Wielokrotne scalanie może się zdarzyć na raz. Na przykład: {(1,1), (1,2)} mają te same dane, a {(2,1), (2,2), (2,3)} mają te same dane. Obie grupy są indywidualnie łączone.

Moje główne pytanie brzmi: jak mam napisać algorytm, aby to zrobić, bez zapisywania każdej możliwej sytuacji. Czy ktoś może pokazać mi przykład czegoś, co zadziała? Rozumiem, że jest to skomplikowane, więc możesz zadawać pytania w celu wyjaśnienia. Dziękuję bardzo za zaawansowane. To jest ogromna pomoc!

+0

Czy tabela jest zawsze 2x3? –

+0

Brzmi jak praca dla .... Mapowania Karnaugh. Zobacz http://pl.wikipedia.org/wiki/Karnaugh_map –

+0

Tabela jest zawsze oryginalna 2 x 3. Łączenie komórek może spowodować, że tabela stanie się 2 x 2 lub 2 x 1. – dremme

Odpowiedz

3

Podoba Ci się to? http://jsfiddle.net/4zGvg/ Działa z dowolnymi wierszami/cols.

Pomysł: macie matrycę values i span. Wartości span

0 = ukryć ta komórka

1 = normalna komórka

x> 1 = komórkowy z rowspan x

iteracyjne kolumnami w bezpośredniej kolejności oraz przez rzędy w odwrotnej kolejności . Jeśli wartość jakiejś komórce jest równa wartości poniżej niego, wzrost ten komórka na span i usunąć span w komórce poniżej:

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; 
     } 
    } 
} 

Gdy to nastąpi, można wykorzystać span wygenerować pełną tabelę lub aby pokazać/ukryj komórki i ustaw ich atrybuty zakresu wierszy.

+0

Bardzo fajnie. Najlepsza odpowiedź, którą znalazłem. Spróbuję wdrożyć to rozwiązanie. Dzięki. – dremme

2

Ponieważ zawsze jest to 2x3, można po prostu bruteforce to.

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); 
} 

To może zdecydowanie być zoptymalizowane, to tylko szybki i brudny. Na pewno chcesz zapisać odniesienia do komórek i nie tyle razy dzwonić pod numer eq. Trzeba by zrobić to samo dla drugiej kolumny.

Jeśli tabela może zmieniać rozmiary, należy przełączyć pętlę na każdą komórkę w kolumnie i dla każdego pasującego zakresu, ukryć dopasowania i ustawić zakres wierszy. Stosunkowo łatwe, ale tak naprawdę nie potrzebne tutaj.

+0

Naprawdę mam wersję bruteforced, która działa dobrze. Miałem nadzieję zoptymalizować to. – dremme

+0

Dla małego statycznego stołu bruteforce będzie optymalna pod względem wydajności. Coś bardziej dynamicznego tylko zwiększy obciążenie. –

+0

Rozumiem. Jestem zadowolony z kodu bruteforce, który napisałem już. Moim powodem do zamieszczenia tego była po prostu moja ciekawość dotycząca dodatkowych rozwiązań. Dzięki za twoją odpowiedź. – dremme

Powiązane problemy