%MAXARR 和 %MINARR (陣列中的元素上限或下限)
%MAXARR(array {: start-index {:number-of-elements}})
%MINARR(array {: start-index {:number-of-elements}})
%MAXARR 傳回陣列最大值的索引。 %MINARR 傳回陣列最小值的索引。
%MAXARR 及 %MINARR 的第一個運算元可以是純量陣列或索引陣列資料結構,格式為 ARRAY_DS_NAME (*). SUBFIELD_NAME。
若要在 陣列資料結構中尋找子欄位的最大值,請以索引 (*) 指定資料結構名稱,然後指定子欄位。 例如,若要尋找陣列資料結構 INFO 的元素,以及子欄位 CODE的最大值,請指定 INFO (*)。CODE 作為第一個運算元。 (*) 索引之前的完整名稱部分必須代表陣列,而 (*) 之後的完整名稱部分必須代表純量子欄位或索引純量陣列。
如果指定 start-element 運算元,則會從指定的元素開始搜尋最大或最小元素。 否則,會從第一個元素開始搜尋最大或最小元素。
如果指定 number-of-elements 運算元,則搜尋上限或下限元素會限制為指定的元素數目。 否則,搜尋最大或最小元素會包含從 start-element開始的所有元素。 如果 number-of-elements 運算元具有值零,則不會搜尋任何元素; %MAXARR 和 %MINARR 會傳回值零。
對於由 DIM (*AUTO) 或 DIM (*VAR) 指定的可變維度陣列,如果陣列目前沒有元素, %MAXARR 和 %MINARR 會傳回值零。
如果替代對照順序對英數陣列有效,則除非對陣列指定 ALTSEQ (*NONE) ,否則會使用替代對照順序。 例如,如果指定控制關鍵字 ALTSEQ (*EXT) 及 SRTSEQ (*LANGIDSHR) ,則會將值 'ABC' 與 'abc' 視為相等。 如果陣列具有具有這兩個值的元素,則 %MAXARR 或 %MINARR 會傳回具有這兩個值之一的第一個元素的索引。
循序陣列的 %MAXARR 和 %MINARR
如果陣列是遞增 (為陣列指定關鍵字 ASCEND) ,則 %MAXARR 的搜尋會從要搜尋的最後一個元素開始,並繼續往回搜尋,直到找到不等於最後一個元素的值為止。 例如,如果遞增陣列 array1 具有值 [1,2,3,3, 3] ,則 %MAXARR 會傳回值為 3 的第一個元素的索引。
如果陣列是遞減 (關鍵字 DESCEND 指定給陣列) ,則 %MAXARR 會傳回陣列中第一個元素的索引。
如果陣列是遞增 (為陣列指定關鍵字 ASCEND) ,則 %MINARR 會傳回陣列中第一個元素的索引。
如果陣列是遞減 (對陣列指定關鍵字 DESCEND) ,則 %MINARR 的搜尋會從要搜尋的最後一個元素開始,並繼續往回搜尋,直到找到不等於最後一個元素的值為止。 例如,如果遞減陣列 array2 具有值 [5,4,3,2, 2] ,則 %MAXARR 會傳回值為 2 的第一個元素的索引。
%MAXARR 和 %MINARR 的範例
- 表示式中使用了 %MAXARR 和 %MINARR
- 第三個元素在陣列中具有最大值,因此 %MAXARR 會傳回值 3。 %MAXARR 的結果用作陣列的索引,因此 value 具有元素 3 的值 'Saturn'。
- 第四個元素在陣列中具有最小值,因此 %MINARR 會傳回值 4。 %MINARR 的結果用作陣列的索引,因此 value 具有元素 4 的值 'Jupiter'。
DCL-S array CHAR(10) DIM(5); DCL-S value LIKE(array); array = %LIST('Mercury' : 'Mars' : 'Saturn' : 'Jupiter' : 'Neptune'); value = array(%MAXARR(array)); // 1 value = array(%MINARR(array)); // 2 - 索引陣列資料結構的 %MAXARR 和 %MINARR
- 陣列 的第二個元素具有 NAME 子欄位的最大值 'Tom' ,因此 %MAXARR 會傳回值 2。
- 陣列 的第一個元素具有 ID 子欄位的最小值 12345 ,因此 %MINARR 會傳回值 1。
DCL-DS array QUALIFIED DIM(3); name VARCHAR(10); id PACKED(5); END-DS; DCL-S p INT(10); array(1).name = 'Jack'; array(1).id = 12345; array(2).name = 'Tom'; array(2).id = 65432; array(3).name = 'Alice'; array(3).id = 34567; p = %MAXARR(array(*).name); // 1 p = %MINARR(array(*).id); // 2 - %MAXARR 代表未排序的陣列 (未針對陣列指定ASCEND 及 DESCEND )
- 會在整個陣列中搜尋最大元素。 陣列中的最大值為 'g' ,因此 maxElem 具有值 2。
- start-element 運算元以值 3 指定,因此 maxElem 會設為從元素 3 開始的元素最大值索引。 元素 3-5 中的最大值是 'f'。 兩個元素具有值 'f' ,但 %MAXARR 會傳回具有最大值的第一個元素的索引,因此 maxElem 具有值 3。
- start-element 運算元以值 4 指定,因此 maxElem 會設為元素 4-5 的最大值索引。 元素 3 和 4 都具有值 'f' ,但搜尋不包括元素 3 ,因此 maxElem 具有值 4。
DCL-S array CHAR(10) DIM(5); DCL-S maxElem INT(10); array = %LIST('a' : 'g' : 'f' : 'f' : 'c'); maxElem = %MAXARR (array); // 1 maxElem = %MAXARR (array : 3); // 2 maxElem = %MAXARR (array : 4); // 3 - %MINARR 代表未排序的陣列 (未針對陣列指定ASCEND 及 DESCEND )
- 搜尋整個陣列以找出最小元素。 陣列中的最小值為 'b' ,因此 minElem 具有值 2。
- start-element 運算元以值 3 指定,因此 minElem 會設為從元素 3 開始的元素最小值索引。 元素 3-5 中的最小值為 'c'。 兩個元素具有值 ' c' ,但 %MINARR 會傳回具有最小值的第一個元素的索引,因此 minElem 具有值 3。
- start-element 運算元以值 4 指定,因此 minElem 會設為元素 4-5 的最小值索引。 元素 3 和 4 都具有值 ' c' ,但搜尋不包括元素 3 ,因此 minElem 具有值 4。
- start-element 運算元以值 2 指定,而 number-of-elements 運算元以值 3 指定,因此 minElem 會設為元素 2-4 的最小值索引。 這些元素的最小值為 'b' ,因此 minElem 具有值 2。
DCL-S array CHAR(10) DIM(5); DCL-S minElem INT(10); array = %LIST('k' : 'b' : 'c' : 'c' : 'x'); minElem = %MINARR (array); // 1 minElem = %MINARR (array : 3); // 2 minElem = %MINARR (array : 4); // 3 minElem = %MINARR (array : 2 : 3); // 4 - %MAXARR 和 %MINARR 代表遞增陣列 (ASCEND 指定給陣列)
- 搜尋最大元素從陣列結尾開始。 陣列中最後兩個元素具有相同的值,因此 maxElem 具有值 4。
- 遞增陣列的第一個元素在陣列中具有最小值,因此 minElem 具有值 1。
DCL-S array CHAR(10) DIM(5) ASCEND; DCL-S maxElem INT(10); DCL-S minElem INT(10); array = %LIST('a' : 'a' : 'b' : 'c' : 'c'); maxElem = %MAXARR (array); // 1 minElem = %MINARR (array); // 2