%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 和 %MINARR
    1. 第三個元素在陣列中具有最大值,因此 %MAXARR 會傳回值 3。 %MAXARR 的結果用作陣列的索引,因此 value 具有元素 3 的值 'Saturn'。
    2. 第四個元素在陣列中具有最小值,因此 %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
    1. 陣列 的第二個元素具有 NAME 子欄位的最大值 'Tom' ,因此 %MAXARR 會傳回值 2。
    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 代表未排序的陣列 (未針對陣列指定ASCENDDESCEND )
    1. 會在整個陣列中搜尋最大元素。 陣列中的最大值為 'g' ,因此 maxElem 具有值 2。
    2. start-element 運算元以值 3 指定,因此 maxElem 會設為從元素 3 開始的元素最大值索引。 元素 3-5 中的最大值是 'f'。 兩個元素具有值 'f' ,但 %MAXARR 會傳回具有最大值的第一個元素的索引,因此 maxElem 具有值 3。
    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 代表未排序的陣列 (未針對陣列指定ASCENDDESCEND )
    1. 搜尋整個陣列以找出最小元素。 陣列中的最小值為 'b' ,因此 minElem 具有值 2。
    2. start-element 運算元以值 3 指定,因此 minElem 會設為從元素 3 開始的元素最小值索引。 元素 3-5 中的最小值為 'c'。 兩個元素具有值 ' c' ,但 %MINARR 會傳回具有最小值的第一個元素的索引,因此 minElem 具有值 3。
    3. start-element 運算元以值 4 指定,因此 minElem 會設為元素 4-5 的最小值索引。 元素 3 和 4 都具有值 ' c' ,但搜尋不包括元素 3 ,因此 minElem 具有值 4。
    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 指定給陣列)
    1. 搜尋最大元素從陣列結尾開始。 陣列中最後兩個元素具有相同的值,因此 maxElem 具有值 4。
    2. 遞增陣列的第一個元素在陣列中具有最小值,因此 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