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)时间复杂度检查数组是否有序