From 0f30cd7ddef963485ffed1b2298bdfc52d78ee50 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 9 Sep 2024 22:13:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DArrayUtil.lastIndexOfSub?= =?UTF-8?q?=E9=80=92=E5=BD=92=E6=94=B9=E4=B8=BA=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/ArrayUtil.java | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java index ce9ec0df7..fec7c759d 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java @@ -1824,21 +1824,34 @@ public class ArrayUtil extends PrimitiveArrayUtil { * @since 5.4.8 */ public static int indexOfSub(T[] array, int beginInclude, T[] subArray) { - if (isEmpty(array) || isEmpty(subArray) || subArray.length > array.length) { + if (isEmpty(array) || isEmpty(subArray)) { return INDEX_NOT_FOUND; } - int firstIndex = indexOf(array, subArray[0], beginInclude); - if (firstIndex < 0 || firstIndex + subArray.length > array.length) { + if(beginInclude < 0){ + beginInclude += array.length; + } + if(beginInclude < 0 || beginInclude > array.length - 1){ + return INDEX_NOT_FOUND; + } + if (array.length - beginInclude < subArray.length) { + // 剩余长度不足 return INDEX_NOT_FOUND; } - for (int i = 0; i < subArray.length; i++) { - if (false == ObjectUtil.equal(array[i + firstIndex], subArray[i])) { - return indexOfSub(array, firstIndex + 1, subArray); + for (int i = beginInclude; i <= array.length - subArray.length; i++) { + boolean found = true; + for (int j = 0; j < subArray.length; j++) { + if (ObjUtil.notEqual(array[i + j], subArray[j])) { + found = false; + break; + } + } + if (found) { + return i; } } - return firstIndex; + return INDEX_NOT_FOUND; } /** @@ -1871,33 +1884,35 @@ public class ArrayUtil extends PrimitiveArrayUtil { if (isEmpty(array) || isEmpty(subArray)) { return INDEX_NOT_FOUND; } - if(endInclude < 0){ + if (endInclude < 0) { endInclude += array.length; } - if(endInclude < 0){ + if (endInclude < 0) { return INDEX_NOT_FOUND; } - if(endInclude > array.length - 1){ + if (endInclude > array.length - 1) { // 结束位置超过最大值 endInclude = array.length - 1; } - if(subArray.length - 1 > endInclude){ + if (subArray.length - 1 > endInclude) { // 剩余长度不足 return INDEX_NOT_FOUND; } - final int firstIndex = lastIndexOf(array, subArray[0], endInclude); - if (firstIndex < 0 || firstIndex + subArray.length > array.length) { - return INDEX_NOT_FOUND; - } - - for (int i = 0; i < subArray.length; i++) { - if (ObjUtil.notEqual(array[i + firstIndex], subArray[i])) { - return lastIndexOfSub(array, firstIndex - 1, subArray); + for (int i = Math.min(array.length - subArray.length, endInclude); i >= 0; i--) { + boolean found = true; + for (int j = 0; j < subArray.length; j++) { + if (ObjUtil.notEqual(array[i + j], subArray[j])) { + found = false; + break; + } + } + if (found) { + return i; } } - return firstIndex; + return INDEX_NOT_FOUND; } // O(n)时间复杂度检查数组是否有序