Algoritmus - számozás TOC (Table of Contents)

szavazat
3

Szeretnék végre egy VBA függvényt száma Excel sorok alapján csoportosítás mélysége a sorban.

De azt hiszem, egy általános algoritmusát TOC sokkal érdekesebb.

Az a baj:

Adott egy lista a „tagolt” sorokat, mint a

One
 Two
  Three
   Four
 Five
Six

(A „behúzás mértékét” lehet feltételezzük, hogy ismert, és része a bemeneti adatok)

Ahhoz, hogy létrehoz a következő kimenetet:

1.    One
1.1    Two
1.1.1   Three
1.1.1.1  Four
1.2    Five
2.    Six

Természetesen a kód van, és fut ... és még alá rejtett THWoS (a nagy súlya Shame)

A kérdést 01/06/2010 00:20
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
8

Használjon verem a számokat. Hurok keresztül minden sorban, és ellenőrizze a behúzás szintjét minden sorban, nincs behúzás, hogy 1. szintű.

  1. Ha az aktuális behúzás mértékét nagyobb, mint a méret a verem tolja annyi is, mint a különbség a verembe (a különbség azonban általában csak az egyik, de ez akkor is működik, ha valaki tesz egy 3. szintű fejléc alatt egy 1. szintű címsor, például)
  2. Ha az aktuális behúzás szint alacsonyabb, mint a méret a verem, pop, és dobja annyi szám, mint a különbség, majd növeljük a felső szám a verem.
  3. Ha az aktuális behúzás mértékét megegyezik a méret a verem, megnövelni a felső szám a verem

Minden egyes sorban, az aktuális cím számát a számok a verem összefűzött együtt. szétválasztani őket.

Megjegyzendő, hogy a méret a verem ügyesen képviseli az előző vonal behúzás mértékét.

Azoknak az embereknek, akiknek könnyebb olvasni kódot, itt van egy JavaScript végrehajtása a modern böngészők:

const toc = `
One
 Two
  Three
   Four
 Five
  Six
  Seven
 Eight
Nine
Ten
`;

let stack = [];

toc.trim().split(/\n/g).forEach(line => {
  // Gets the identitation level with 1 being no indentation and so forth
  let level = line.match(/^\s*/)[0].length + 1;

  if (level > stack.length) {
    while (level > stack.length)
      stack.push(1);
  } else {
    while (level < stack.length)
      stack.pop();

    stack[stack.length - 1]++;
  }
  
  let title = stack.join(".") + ". " + line.trim();

  document.body.appendChild(document.createElement("div")).innerText = title;
});

Válaszolt 01/06/2010 00:33
a forrás felhasználó

szavazat
2

Ez az algoritmus feltételezi, hogy behúzás mértékét nem növeli több mint 1 egység. Ha igen, akkor meg kell adnia az összes „kihagyott” szinten 1.

#use a vector instead, if your language supports it
numbering = {0, 0, 0, 0, 0, 0, 0}

for line in lines:
    level = indentLevel(line) #starting from 0

    numbering[level] = numbering[level] + 1
    numbering[level + 1] = 0 #create it if it doesn't exist
    for n = 0 to level - 1
        print numbering[n], ".",
    print numbering[level], " ", line
Válaszolt 01/06/2010 00:42
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more