尋找數組中最大值的索引
1. 概述
在 Java 中使用陣列時,我們可能遇到的日常任務之一是尋找陣列中最大值的索引。
在本快速教程中,我們將介紹幾種簡單有效的方法來完成此任務。
2.問題介紹
尋找陣列中最大元素的索引在各種場景中都很有用,例如尋找遊戲中的最高分數、記錄的最高溫度或任何其他需要識別峰值的情況。
假設我們有一個int數組:
static final int[] ARRAY = { 1, 2, 7, 10, 8, 6 };
不難看出, 10是上面數組中最大的元素。所以,對應的索引是3 。
接下來,我們將以ARRAY為例,探索找出預期索引3不同方法。
為簡單起見,我們假設輸入數組包含一個唯一的最大元素。我們還將跳過輸入驗證,例如null檢查,並使用單元測試斷言來驗證每種方法的結果。
3. 將數組轉換為List
第一個想法是找到數組中最大的元素,然後取得其索引。找到最大的價值對我們來說並不是一個挑戰。但是Java沒有提供indexOf(element)方法來讓陣列取得元素的索引。
我們知道List有indexOf()方法。因此,我們先將int數組轉換為List ,然後再找到最大值的索引:
int indexOfTheMax(int[] array) {
List<Integer> list = Arrays.stream(array)
.boxed()
.toList();
int max = Collections.max(list);
return list.indexOf(max);
}
在上面的程式碼中,我們使用 Stream API 將原始int數組轉換為Integer List 。然後,我們再次使用 Stream API 來尋找清單的最大值。
值得注意的是**max()方法傳回一個Optional物件**。因此,我們使用orElse()方法來取得它的值。如果輸入數組為空,則方法傳回-1 。
如果我們將ARRAY或空數組當作輸入傳遞給indexOfTheMax()方法,它將傳回預期值:
int result = indexOfTheMax(ARRAY);
assertEquals(3, result);
result = indexOfTheMax(new int[] {});
assertEquals(-1, result);
這種方法解決了這個問題。然而,它多次遍歷數組。
4. 循環數組
我們可以遍歷數組來找到最大元素的索引。
首先我們來看看實作:
int indexOfTheMaxByLoop(int[] array) {
if (array.length == 0) {
return -1;
}
int idx = 0;
for (int i = 1; i < array.length; i++) {
idx = array[i] > array[idx] ? i : idx;
}
return idx;
}
在indexOfTheMaxByLoop()中,我們宣告並初始化了idx變數來儲存檢查和處理空數組情況後的結果。然後,我們循環遍歷數組。每當我們發現一個元素array[i]大於array[idx],我們就會更新**idx = i** .
最後,該方法傳回idx ,它保存最大值的索引。
接下來,我們來測試一下indexOfTheMaxByLoop()方法:
int result = indexOfTheMaxByLoop(ARRAY);
assertEquals(3, result);
result = indexOfTheMaxByLoop(new int[] {});
assertEquals(-1, result);
正如我們所看到的,這種方法報告了正確的結果。
5. 使用串流API
在indexOfTheMaxByLoop()方法中,我們使用經典的for迴圈來遍歷輸入陣列來解決問題。或者,我們可以使用 Stream API 實作相同的邏輯。
接下來我們來看看如何實現:
int indexOfTheMaxByStream(int[] array) {
return IntStream.range(0, array.length)
.boxed()
.max(Comparator.comparingInt(i -> array[i]))
.orElse(-1);
}
如程式碼所示,我們使用range()方法建構一個IntStream 。要注意的是,這個IntStream包含數組的索引而不是數組元素。
然後,我們將Comparator傳遞給max()方法,該方法比較元素值 ( array[i] )。由於結果是Optional我們使用orElse(-1)來取得索引。這對我們來說並不新鮮。
最後,讓我們建立一個測試來驗證indexOfTheMaxByStream()是否可以完成這項工作:
int result = indexOfTheMaxByStream(ARRAY);
assertEquals(3, result);
result = indexOfTheMaxByStream(new int[] {});
assertEquals(-1, result);
如測試所示, indexOfTheMaxByStream()為空和非空數組輸入提供了正確的結果。
六,結論
在 Java 中尋找數組中最大值的索引是一項簡單的任務。在本文中,我們探索了解決此問題的不同方法。
與往常一樣,範例的完整原始程式碼可在 GitHub 上取得。