2010-05-31 5 views
3

행의 그룹화 깊이를 기준으로 Excel 행의 번호를 매기는 VBA 함수를 구현하고 싶습니다.알고리즘 - TOC (목차) 번호 매기기

하지만 TOC 생성을위한 일반적인 알고리즘이 더 재미 있다고 생각합니다.

문제가 :

One 
Two 
    Three 
    Four 
Five 
Six 

같이 "톱니"라인리스트에 근거

(이하 "요철 레벨"공지 및 입력 데이터의 부분으로 간주 될 수있다) 내 코드가 및 R입니다 물론

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

:

다음과 같은 출력을 생성하려면 그리고 ... THWoS (수치심의 무게)

+0

작업 코드가 있습니다. 그 때 당신이 필요로하는 것은 무엇입니까? –

+1

@ 모론 : 나는 일을 끝내기 위해 여기에 온 것이 아니라 다른 사람들에게서 더 나은 방법을 배우고 가능한 한 도와 준다. BTW ... 왜 그 의견으로 당신의 시간을 낭비하고 있습니까? –

+0

특정 질문이 없었으며 FAQ를 읽으십시오. 토론 게시판이 아닙니다. 더 이상 대답하지 않으면 나를 용서해주십시오. –

답변

8

숫자에 스택을 사용하십시오. 각 행에 대해 반복하고, 아니오 압입 존재 레벨 차이가 상 같이 현재 압입 레벨 많은 것과 스택 푸쉬의 크기보다 큰 경우 1

  1. 와, 각 행의 압입 레벨을 확인 stack (차이는 대개 하나 일 뿐이지 만 누군가가 레벨 1 제목 아래에 레벨 3 표제를 넣어도 작동합니다)
  2. 현재 들여 쓰기 레벨이 스택 크기보다 작 으면 팝 및 버려집니다 그 차이만큼의 숫자가 그 다음 스택의 맨 위 숫자를 증가시킵니다.
  3. 현재 압입 레벨 스택의 크기가 동일하면
  4. 는 스택의 각 행에 대해

상위 수가 증가, 현재 타이틀 번호가 함께 연결된 스택의 숫자이다. 그들을 분리하십시오.

스택의 크기가 이전 줄의 들여 쓰기 수준을 어떻게 표현하는지주의하십시오. 쉽게 코드를 읽어 찾을 사람들을 위해

, 여기에 최신 브라우저의 자바 스크립트 구현의 :

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

2

이 알고리즘은 들여 쓰기 수준 이상 1 개 단위 씩 증가하지 가정합니다. 그럴 경우 모든 "건너 뛴"레벨을 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