Step By Step (Lua 데이터 구조)
                                            
 13044 단어  데이터 구조
                    
1 a = {}
2 for i = 1, 1000 do
3     a[i] = 0
4 end
5 print("The length of array 'a' is " .. #a)
6 --The length of array 'a' is 1000Lua 에 서 는 모든 수 를 배열 의 시작 색인 으로 할 수 있 지만, 일반적으로 1 을 시작 색인 값 으로 사용 합 니 다.또한 많은 Lua 의 내장 기능 과 함 수 는 이러한 특징 에 의존 하기 때문에 충분 한 이유 가 없 는 전제 에서 이 규칙 을 최대한 보장 합 니 다.다음 방법 은 table 의 구조 기 를 통 해 배열 을 만 들 고 초기 화 하 는 것 입 니 다. 예 를 들 어: squares = {1, 4, 9, 16, 25} 2. 2 차원 배열: Lua 에서 우 리 는 두 가지 방식 으로 table 구조의 다 차원 배열 을 이용 할 수 있다.그 중에서 첫 번 째 방식 은 '배열 의 배열' 방식 으로 다 차원 배열 을 실현 하 는 것 이다. 즉, 1 차원 배열 의 모든 요소 도 table 대상 이다. 예 를 들 어:
1 mt = {}
2 for i = 1, N do
3     mt[i] = {}
4     for j = 1, M do
5         mt[i][j] = i * j
6     end
7 end두 번 째 방식 은 2 차원 배열 의 색인 을 펼 치고 고정된 상수 로 2 차원 의 보폭 으로 하 는 것 이다. 예 를 들 어:
1 mt = {}
2 for i = 1, N do
3     for j = 1, M do
4         mt[(i - 1) * M + j] = i * j
5     end
6 end3. 링크: table 은 동태 적 인 실체 이기 때문에 Lua 에서 링크 를 실현 하 는 것 이 편리 합 니 다.그 중에서 모든 노드 는 table 로 표 시 됩 니 다. 하나의 '링크' 는 노드 의 한 필드 일 뿐 이 필드 는 다른 table 에 대한 인용 을 포함 합 니 다. 예 를 들 어:
 1 list = nil
 2 for i = 1, 10 do
 3     list = { next = list, value = i}
 4 end
 5 
 6 local l = list
 7 while l do
 8     print(l.value)
 9     l = l.next
10 end4. 대기 열과 양 방향 대기 열: Lua 에서 대기 열 을 실현 하 는 간단 한 방법 은 table 라 이브 러 리 함수 insert 와 reove 를 사용 하 는 것 입 니 다.그러나 이런 방법 은 후속 요소 의 이동 을 초래 할 수 있 기 때문에 대기 열의 데이터 양 이 비교적 많 을 때 이 방법 을 사용 하 는 것 을 권장 하지 않 는 다.아래 의 코드 는 더욱 효율 적 인 실현 방식 이다. 예 를 들 어:
 1 List = {}
 2 
 3 function List.new()
 4     return {first = 0, last = -1}
 5 end
 6 
 7 function List.pushFront(list, value)
 8     local first = list.first - 1
 9     list.first = first
10     list[first] = value
11 end
12 
13 function List.pushBack(list, value)
14     local last = list.last + 1
15     list.last = last
16     list[last] = value
17 end
18 
19 function List.popFront(list)
20     local first = list.first
21     if first > list.last then
22         error("List is empty")
23     end
24     local value = list[first]
25     list[first] = nil
26     list.first = first + 1
27     return value
28 end
29 
30 function List.popBack(list)
31     local last = list.last
32     if list.first > last then
33         error("List is empty")
34     end
35     local value = list[last]
36     list[last] = nil
37     list.last = last - 1
38     return value
39 end5. 집합 과 가방 (Bag): Lua 에서 table 로 집합 을 실현 하 는 것 은 매우 간단 합 니 다. 다음 코드 를 보십시오. reserved = { ["while"] = true, ["end"] = true, ["function"] = true, } if not reserved["while"] then --do something end Lua 에 서 는 가방 (Bag) 을 MultiSet 로 볼 수 있 는데, 일반 집합 과 달리 이 용기 에 서 는 key 와 같은 원소 가 용기 에 여러 번 나타 날 수 있 도록 허용 한다.다음 코드 는 table 의 요소 에 계수 기 를 추가 하 는 방식 으로 이 데이터 구 조 를 모 의 합 니 다. 예 를 들 어:
1 function insert(bag, element)
2     bag[element] = (bag[element] or 0) + 1
3 end
4 
5 function remove(bag, element)
6     local count = bag[element]
7     bag[element] = (count and count > 1) and count - 1 or nil
8 end6. StringBuilder: Lua 에서 여러 문자열 을 하나의 큰 문자열 로 연결 하려 면 다음 과 같은 방식 으로 이 루어 질 수 있 습 니 다.
1 local buff = ""
2 for line in io.lines() do
3     buff = buff .. line .. "
"
4 end위의 코드 는 확실히 정상적으로 작업 을 완성 할 수 있 지만, 줄 수가 비교적 많 을 때, 이러한 방법 은 대량의 메모리 재분배 와 메모리 간 의 데이터 복 사 를 초래 할 수 있 으 며, 이 로 인해 가 져 오 는 성능 비용 도 상당히 상당 하 다.사실 많은 프로 그래 밍 언어 에서 String 은 자바 와 같은 가 변 대상 이 므 로 이 방식 을 통 해 큰 문자열 을 여러 번 연결 하면 같은 성능 문 제 를 일 으 킬 수 있 습 니 다.이 문 제 를 해결 하기 위해 자바 에 서 는 StringBuilder 류 를 제공 하고 Lua 에 서 는 table 의 concat 방법 으로 이 문 제 를 해결 할 수 있 습 니 다. 다음 코드 를 참조 하 십시오.
 1 local t = {}
 2 for line in io.lines() do
 3     t[#t + 1] = line .. "
"
 4 end
 5 local s = table.concat(t)
 6 
 7 --concat          ,            :
 8 local t = {}
 9 for line in io.lines() do
10     t[#t + 1] = line
11 end
12 local s = table.concat(t,"
")이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.