Algoritma - TOC için numaralama (İçindekiler)

oy
3

Ben satırın gruplama derinliği dayalı sayı Excel satırlara bir VBA işlevi uygulamak istiyoruz.

Ama Tocs üretmek için genel bir algoritma daha ilginç olduğunu düşünüyorum.

Problem şu:

gibi girintili satırlarının bir listesini Verilen

One
 Two
  Three
   Four
 Five
Six

( Girinti düzeyi bilinen varsayılır ve giriş verilerinin bir parçası olabilir)

Aşağıdaki çıktıyı üretmek için:

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

Tabii benim kod ve çalışıyor ... ve ayrıca THWoS altında gizli olan (Utanç Ağır Ağırlığı)

Oluştur 01/06/2010 saat 00:20
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
8

sayılar için bir yığın kullanın. Her sırada döngü ve seviye 1 olmak bir girinti ile, her bir sıranın girinti seviyesini kontrol edin.

  1. Geçerli girinti düzeyi birçok olanlar kadar yığın itme boyutundan büyükse fark fark genellikle sadece biri olacağını (yığının üzerine olduğu gibi, ama birisi bir seviye 1 başlığı altında bir seviye 3 başlık koyar bile bu işleri, Örneğin)
  2. mevcut girinti düzeyi yığın, pop boyutundan daha azdır ve fark ve daha sonra istif üst numarası artırmak kadar numaralar atmak edin.
  3. mevcut girinti düzeyi yığın boyutuna eşit ise, istifin üst numarası artırmak

Her satır için, mevcut başlık numarası ile birbirine bağlanır yığında sayılardır. Onları ayırmak için.

yığının boyutu dezavantaj önceki hat girinti düzeyini temsil olduğuna dikkat edin.

daha kolay kod okumayı bulmak insanlar için buraya modern tarayıcılar için bir JavaScript uygulaması var:

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

Cevap 01/06/2010 saat 00:33
kaynak kullanıcı

oy
2

Bu algoritma girinti seviyesi asla 1'den fazla birimi tarafından artar varsayar. Eğer varsa, o zaman 1 olarak tüm "atla" düzeylerini ayarlamak gerekir.

#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
Cevap 01/06/2010 saat 00:42
kaynak kullanıcı

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