목록으로

Object Array()

Pml Basic 4

Array

PML을 사용하는 이유가 반복적인 작업을 단순화하려는 만큼, Array는 매우 많이 사용됩니다. 기본적인 PML1 방식의 Array보다 PML2 방식의 Array를 이용하면 좀 더 효율적으로 PML을 작성할 수 있습니다. 1차원 배열과 2차원 배열을 PML1 방식과 PML2 방식으로 다뤄보도록 하겠습니다.


1. 1차원 배열

1차원 배열은 단일 리스트로, Element들이 하나의 차원에 배열됩니다. 예를 들어, ['apple','banana', 'cherry']와 같은 배열이 1차원 배열입니다. Array에 Append를 하기 전, 반드시 OBJECT ARRAY()로 배열을 우선 생성해야 합니다.(직접 할당하면 생략해도 됨)

1.1 1차원 Array 생성 및 사용 (APPEND 로 추가)

배열을 생성한 후 .APPEND() 메서드를 사용해 Element를 추가합니다.

!array = OBJECT ARRAY()  -- 1차원 배열 생성

!array.APPEND('apple')  -- 첫 번째 Element 추가
!array.APPEND('banana')  -- 두 번째 Element 추가
!array.APPEND('cherry')  -- 세 번째 Element 추가

q var !array
  • 배열 생성: OBJECT ARRAY()로 빈 배열을 생성합니다.
  • Element 추가: .APPEND() 메서드를 사용해 배열에 Element를 순차적으로 추가합니다.
  • Element 접근: 인덱스를 통해 배열 내 Element에 접근합니다. PML에서는 배열의 인덱스가 1부터 시작하므로 첫 번째 Element는 !array[1]으로 접근합니다.

1.2 1차원 Array 생성 및 사용 (직접 할당)

배열을 생성한 후 인덱스를 사용해 직접 값을 할당할 수 있습니다.

!array = OBJECT ARRAY()  -- 1차원 배열 생성

!array[1] = 'apple'  -- 첫 번째 Element 할당
!array[2] = 'banana'  -- 두 번째 Element 할당
!array[3] = 'cherry'  -- 세 번째 Element 할당

q var !array
  • 배열 생성: OBJECT ARRAY()로 빈 배열을 생성합니다.
  • 인덱스 할당: 배열의 각 위치에 인덱스를 통해 직접 Element를 할당합니다.
  • Element 접근: 인덱스를 통해 배열 내 Element에 접근합니다. PML에서는 배열의 인덱스가 1부터 시작하므로 첫 번째 Element는 !array[1]으로 접근합니다..

2. 2차원 배열

PML에서 2차원 배열은 배열 내에 배열을 추가하는 방식으로 구현됩니다. 이는 행(row)을 배열로 만들고, 이 행들을 또 다른 배열에 추가하는 방식으로 구성됩니다.

2.1 APPEND를 이용한 2차원배열

-- 배열 생성
!oArray = OBJECT ARRAY()  -- 2차원 배열 생성
!oRow1 = OBJECT ARRAY()   -- 첫 번째 행 생성
!oRow2 = OBJECT ARRAY()   -- 두 번째 행 생성

-- 첫 번째 행에 Element 추가
!oRow1.APPEND('Row1 Element1')
!oRow1.APPEND('Row1 Element2')

-- 두 번째 행에 Element 추가
!oRow2.APPEND('Row2 Element1')
!oRow2.APPEND('Row2 Element2')

-- 2차원 배열에 행 추가
!oArray.APPEND(!oRow1)
!oArray.APPEND(!oRow2)

-- Element 접근
q var !oArray
  • 배열 생성: OBJECT ARRAY()로 빈 배열을 생성하고, 각 행을 다른 배열로 만듭니다.
  • Element 추가: 각 행에 .APPEND() 메서드를 사용해 Element를 추가합니다.
  • 배열에 배열 추가: 각 행(배열)을 2차원 배열에 .APPEND() 메서드로 추가합니다.
  • Element 접근: [행][열] 방식으로 접근합니다. 예를 들어 !oArray[1][1]은 첫 번째 행의 첫 번째 Element입니다.

2.2 직접 값 할당을 통한 2차원 배열

예시:

-- 배열 생성
!oArray = OBJECT ARRAY()  -- 2차원 배열 생성

-- 인덱스를 사용해 Element 직접 할당
!oArray[1][1] = 'Row1 Element1'
!oArray[1][2] = 'Row1 Element2'

!oArray[2][1] = 'Row2 Element1'
!oArray[2][2] = 'Row2 Element2'

-- Element 접근
q var !oArray
  • 배열 생성: OBJECT ARRAY()로 빈 배열을 생성합니다.
  • 인덱스 할당: 각 행과 열에 직접 Element를 할당합니다.
  • Element 접근: [행][열] 형식으로 Element에 접근할 수 있습니다. 예를 들어 !oArray[1][1]은 첫 번째 행의 첫 번째 Element입니다.

3. Array Method

3.1 APPEND()

  • 기능: 배열의 끝에 새로운 Element를 추가합니다.
  • 사용법: !array.APPEND(값)

예시:

!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array.APPEND('Element2')
q var !array

결과:

<ARRAY>
   [1]  <STRING> 'Element1'
   [2]  <STRING> 'Element2'


3.2 SIZE()

  • 기능: 배열에 있는 Element의 개수를 반환합니다.
  • 사용법: !size = !array.SIZE()

예시:


!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[2] = 'Element2'
!array.APPEND('Element3')
!size = !array.SIZE()

Q VAR !size

결과:

<REAL> 3

3.3 FIND()

  • 기능: 배열 내에서 특정 값을 찾아 그 값의 인덱스를 반환합니다. 값이 없을 경우 빈 값을 반환합니다.
  • 사용법: !index = !array.FIND(값)

예시:


!array = OBJECT ARRAY()
!array.APPEND('Apple')
!array[2] = 'Banana'
!array.APPEND('Cherry')
!array[4] = 'Banana'

!result = !array.FIND('Banana')
Q VAR !result 

결과:

<ARRAY>
   [1]  <REAL> 2
   [2]  <REAL> 4

3.3 FINDFIRST()

  • 기능: 배열 내에서 특정 값과 일치하는 첫 번째 값을 찾아 그 값의 인덱스를 반환합니다. 값이 없을 경우 빈 값을 반환합니다.
  • 사용법: !index = !array.FINDFIRST(값)

예시:


!array = OBJECT ARRAY()
!array.APPEND('Apple')
!array[2] = 'Banana'
!array.APPEND('Cherry')
!array[4] = 'Banana'

!result = !array.FINDFIRST('Banana')
Q VAR !result 

결과:

<REAL> 2

3.4 JOIN()

  • 기능: 배열의 모든 Element를 특정 구분자로 결합하여 하나의 문자열로 반환합니다.
  • 사용법: !joinedString = !array.JOIN(', ')

예시:

!array = OBJECT ARRAY()
!array.APPEND('Apple')
!array[2] = 'Banana'
!array.APPEND('Cherry')

!result = !array.JOIN(', ')

q var !result 

결과:

<STRING> 'Apple, Banana, Cherry'

3.5 CLEAR()

  • 기능: 배열 내 모든 Element를 제거하여 배열을 초기화합니다.
  • 사용법: !array.CLEAR()

예시:

!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[2] = 'Element2'

q var !array

!array.CLEAR()

q var !array

결과:

<ARRAY>
   [1]  <STRING> 'Element1'
   [2]  <STRING> 'Element2'

<ARRAY> - Unset and Empty

3.6 SORT()

  • 기능: 배열을 오름차순으로 정렬합니다. 숫자나 문자열을 기준으로 정렬이 가능합니다.
  • 사용법: !array.SORT()

예시:

!array = OBJECT ARRAY()
!array.APPEND('Cherry')
!array[2] = 'Apple'
!array.APPEND('Banana')

!array.SORT()

q var !array

결과:

<ARRAY>
   [1]  <STRING> 'Apple'
   [2]  <STRING> 'Banana'
   [3]  <STRING> 'Cherry'

3.7 UNIQUE()

  • 기능: 배열 내 중복된 Element를 제거하고, 배열을 재정렬합니다.
  • 사용법: !array.UNIQUE()

예시:

!array = OBJECT ARRAY()
!array.APPEND('Apple')
!array.APPEND('Banana')
!array[3] = 'Apple'

q var !array

!array.UNIQUE()

q var !array

결과:

<ARRAY>
   [1]  <STRING> 'Apple'
   [2]  <STRING> 'Banana'
   [3]  <STRING> 'Apple'

<ARRAY>
   [1]  <STRING> 'Apple'
   [2]  <STRING> 'Banana'

3.8 DIFFERENCE()

  • 기능: 두 배열 간의 차집합을 반환합니다. 첫 번째 배열에 존재하지만 두 번째 배열에 없는 Element들로 구성된 새로운 배열을 반환합니다.
  • 사용법: !differenceArray = !array1.DIFFERENCE(!array2)

예시:

!array1 = OBJECT ARRAY()
!array1.APPEND('a')
!array1.APPEND('b')
!array1.APPEND('c')

!array2 = OBJECT ARRAY()
!array2[1] = 'b'
!array2.APPEND('c')

!difference = !array1.DIFFERENCE(!array2)

q var !array1
q var !array2
q var !difference

결과:

<ARRAY>
   [1]  <STRING> 'a'
   [2]  <STRING> 'b'
   [3]  <STRING> 'c'

<ARRAY>
   [1]  <STRING> 'b'
   [2]  <STRING> 'c'

<ARRAY>
   [1]  <STRING> 'a'

3.9 COMPRESS()

  • 기능: 배열에서 빈 Element(정의되지 않은 Element)를 제거하고 배열을 재정렬합니다.
  • 사용법: !array.COMPRESS()

예시:

!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[3] = 'Element3'

q var !array

!array.COMPRESS()

q var !array

결과:

<ARRAY>
   [1]  <STRING> 'Element1'
   [3]  <STRING> 'Element3'

<ARRAY>
   [1]  <STRING> 'Element1'
   [2]  <STRING> 'Element3'

3.10 LAST()

  • 기능: 배열의 마지막 Element를 반환합니다.
  • 사용법: !lastElement = !array.LAST()

예시:


!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[2] = 'Element2'

!lastElement = !array.LAST()

q var !lastElement

결과:

<STRING> 'Element2'

3.11 FIRST()

  • 기능: 배열의 첫 번째 Element를 반환합니다.
  • 사용법: !firstElement = !array.FIRST()

예시:


!array = OBJECT ARRAY()
!array.APPEND('Element1')
!array[2] = 'Element2'

!firstElement = !array.FIRST()

q var !firstElement

결과:

<STRING> 'Element1'

3.12 SPLIT()

  • 기능: 문자열을 주어진 구분자를 기준으로 분리하여 배열(Array)로 반환합니다.
  • 사용법: !LIST = !TEXT.SPLIT('구분자')

예시


!TEXT = |AA BB CC DD EE|  $* 공백으로 구분된 문자열
!LIST = !TEXT.SPLIT(' ')  $* 공백을 기준으로 문자열을 나누어 배열로 변환

q var !LIST

결과:

<ARRAY>
   [1]  <STRING> 'AA'
   [2]  <STRING> 'BB'
   [3]  <STRING> 'CC'
   [4]  <STRING> 'DD'
   [5]  <STRING> 'EE'

3.13 APPENDARRAY(ARRAY values)

  • 기능: APPENDARRAY는 하나의 배열에 다른 배열의 요소들을 모두 추가합니다. 병합된 배열의 상태를 확인할 수 있습니다.

예시:

!array1 = OBJECT ARRAY()
!array2 = OBJECT ARRAY()

!array1[1] = |test1|
!array1[2] = |test2|
!array2.APPEND('apple')
!array2.APPEND('banana')

Q VAR !array1
Q VAR !array2

!array1.APPENDARRAY(!array2)

Q VAR !array1

결과:

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'apple'
   [4]  <STRING> 'banana'

3.14 EVALUATE(BLOCK command)

  • 설명: Evaluate 메서드는 배열의 각 요소에 대해 주어진 명령 블록을 실행하고 그 결과를 새로운 배열로 반환합니다. 각 요소에 연산이 적용된 후 배열의 상태를 확인할 수 있습니다.
  • Block의 경우 추가적으로 설명할게 많기에 Block Object 관련 글 별도로 올리겠습니다.

예시:

!array = OBJECT ARRAY()
!array.APPEND(1)
!array.APPEND(2)

!block = OBJECT BLOCK('!array[!EvalIndex] + 1')
!newArray = !array.EVALUATE(!block)

Q VAR !newArray

결과:

<ARRAY>
   [1]  <REAL> 2
   [2]  <REAL> 3

3.15 REMOVE(REAL index)

  • 설명: Remove 메서드는 배열에서 특정 인덱스의 요소를 제거하고, 배열의 나머지 요소를 재정렬합니다. 제거된 요소와 배열의 상태를 확인할 수 있습니다.

예시:

!array = OBJECT ARRAY()
!array.APPEND('apple')
!array.APPEND('banana')
!array.APPEND('cherry')

Q VAR !array
!removed = !array.REMOVE(2)
Q VAR !removed
Q VAR !array

결과:

!array = OBJECT ARRAY()
!array.APPEND('apple')
!array.APPEND('banana')
!array.APPEND('cherry')

Q VAR !array
!removed = !array.REMOVE(2)
Q VAR !removed
Q VAR !array

3.16 UNION(ARRAY values)

  • 기능: UNION 은 AppendArray와 비슷하지만 중복을 제거한 채로 합쳐집니다..

예시:

!array1 = OBJECT ARRAY()
!array2 = OBJECT ARRAY()

!array1[1] = |apple|
!array1[2] = |test2|
!array1[3] = |test3|
!array2.APPEND('apple')
!array2.APPEND('banana')
!array2.APPEND('banana')


!union = !array1.Union(!array2)
q var !array1
q var !array2
q var !union 

결과:

<ARRAY>
   [1]  <STRING> 'apple'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'test3'

<ARRAY>
   [1]  <STRING> 'apple'
   [2]  <STRING> 'banana'
   [3]  <STRING> 'banana'

<ARRAY>
   [1]  <STRING> 'apple'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'test3'
   [4]  <STRING> 'banana'

3.17 MAXINDEX()

  • 기능: SIZE는 개수를 가져오고 MAXINDEX는 마지막 값을 가져옵니다

예시:

!array[1] = |test2|
!array[2] = |test2|
!array[3] = |test3|
!array[5] = |test4|
!array[9] = |test5|
!array.append(|test6|)

q var !array.MaxIndex()
q var !array.SIZE()

결과:

<REAL> 10

<REAL> 6

3.18 MININDEX()

  • 기능: 첫번째 인덱스를 가져옵니다

예시:

!array[2] = |test2|
!array[3] = |test3|
!array[5] = |test4|
!array[9] = |test5|
!array.append(|test6|)

q var !array.MinIndex()

결과:

<REAL> 2

3.19 Intersect()

  • 기능: Difference와는 다르게 두 배열에 모두 존재하는 요소를 반환합니다

예시:

!array1 = OBJECT ARRAY()
!array2 = OBJECT ARRAY()

!array1[1] = |test1|
!array1[2] = |test2|
!array1[3] = |test3|
!array1[4] = |test4|
!array1[5] = |test5|
!array2.APPEND('test1')
!array2.APPEND('banana')
!array2.APPEND('test5')
!array2.APPEND('apple')

Q VAR !array1
Q VAR !array2
!result = !array1.Intersect(!array2)

Q VAR !result

결과:

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'test3'
   [4]  <STRING> 'test4'
   [5]  <STRING> 'test5'

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'banana'
   [3]  <STRING> 'test5'
   [4]  <STRING> 'apple'

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test5'

3.20 InsertArray(REAL, ARRAY)

  • 기능: ARRAY를 삽입해서 새로운 ARRAY를 만듭니다.

예시:

!array1 = OBJECT ARRAY()
!array2 = OBJECT ARRAY()

!array1[1] = |test1|
!array1[2] = |test2|
!array2.APPEND('apple')
!array2.APPEND('banana')

Q VAR !array1
Q VAR !array2

!array1.InsertArray(2, !array2)

Q VAR !array1

결과:

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'

<ARRAY>
   [1]  <STRING> 'apple'
   [2]  <STRING> 'banana'

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'apple'
   [3]  <STRING> 'banana'
   [4]  <STRING> 'test2'

3.21 WIDTH()

  • 기능: 문자열 요소의 최대 너비(길이)를 반환

예시:

!array[1] = |test1|
!array[2] = |test22|
!array[3] = |test333|
!array[5] = |test|
Q VAR !array.WIDTH()

결과:

<REAL> 7

3.22 Indices()

  • 기능: 배열의 인덱스를 포함하는 배열을 반환

예시:

!array[1] = |test1|
!array[2] = |test22|
!array[3] = |test333|
!array[5] = |test|
Q VAR !array.Indices()

결과:

<ARRAY>
   [1]  <REAL> 1
   [2]  <REAL> 2
   [3]  <REAL> 3
   [4]  <REAL> 5

3.23 FROM(REAL)

  • 기능: 해당 index부터 array를 복사

예시:

!array[1] = |test1|
!array[2] = |test2|
!array[3] = |test3|
!array[4] = |test4|
!array[5] = |test5|

!result = !array.from(3)
q var !array
q var !result

결과:

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'test3'
   [4]  <STRING> 'test4'
   [5]  <STRING> 'test5'

<ARRAY>
   [1]  <STRING> 'test3'
   [2]  <STRING> 'test4'
   [3]  <STRING> 'test5'

3.24 Invert()

  • 기능: 배열을 역순으로 변경

예시:

!array[1] = |test1|
!array[2] = |test2|
!array[3] = |test3|
!array[4] = |test4|
!array[5] = |test5|

q var !array
!array.Invert()
q var !array

결과:

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'test3'
   [4]  <STRING> 'test4'
   [5]  <STRING> 'test5'

<ARRAY>
   [1]  <STRING> 'test5'
   [2]  <STRING> 'test4'
   [3]  <STRING> 'test3'
   [4]  <STRING> 'test2'
   [5]  <STRING> 'test1'

3.25 RemoveFrom(REAL1, REAL2) or RemoveFrom(REAL)

  • 기능: INDEX의 REAL1부터 REAL2개수만큼 삭제 REAL2생략시 REAL1이후 전체삭제

예시:

!array[1] = |test1|
!array[2] = |test2|
!array[3] = |test3|
!array[4] = |test4|
!array[5] = |test5|
q var !array
!array.RemoveFrom(3, 1)
q var !array
!array.RemoveFrom(3)
q var !array

결과:

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'test3'
   [4]  <STRING> 'test4'
   [5]  <STRING> 'test5'

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'test4'
   [4]  <STRING> 'test5'

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'

3.25 Removeto(REAL1, REAL2) or Removeto(REAL)

  • 기능: RemoveFrom은 Real값으로부터 뒤로 삭제했다면 RemoveTo는 앞으로 삭제

예시:

!array[1] = |test1|
!array[2] = |test2|
!array[3] = |test3|
!array[4] = |test4|
!array[5] = |test5|
q var !array
!array.Removeto(3, 2)
q var !array
!array.Removeto(2)
q var !array

결과:

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test2'
   [3]  <STRING> 'test3'
   [4]  <STRING> 'test4'
   [5]  <STRING> 'test5'

<ARRAY>
   [1]  <STRING> 'test1'
   [2]  <STRING> 'test4'
   [3]  <STRING> 'test5'

<ARRAY>
   [1]  <STRING> 'test5'