修复ArrayUtil.lastIndexOfSub递归改为循环

This commit is contained in:
Looly 2024-09-09 22:13:45 +08:00
parent ef299062f8
commit 0f30cd7dde

View File

@ -1824,21 +1824,34 @@ public class ArrayUtil extends PrimitiveArrayUtil {
* @since 5.4.8 * @since 5.4.8
*/ */
public static <T> int indexOfSub(T[] array, int beginInclude, T[] subArray) { public static <T> 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; return INDEX_NOT_FOUND;
} }
int firstIndex = indexOf(array, subArray[0], beginInclude); if(beginInclude < 0){
if (firstIndex < 0 || firstIndex + subArray.length > array.length) { beginInclude += array.length;
}
if(beginInclude < 0 || beginInclude > array.length - 1){
return INDEX_NOT_FOUND;
}
if (array.length - beginInclude < subArray.length) {
// 剩余长度不足
return INDEX_NOT_FOUND; return INDEX_NOT_FOUND;
} }
for (int i = 0; i < subArray.length; i++) { for (int i = beginInclude; i <= array.length - subArray.length; i++) {
if (false == ObjectUtil.equal(array[i + firstIndex], subArray[i])) { boolean found = true;
return indexOfSub(array, firstIndex + 1, subArray); 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,35 +1884,37 @@ public class ArrayUtil extends PrimitiveArrayUtil {
if (isEmpty(array) || isEmpty(subArray)) { if (isEmpty(array) || isEmpty(subArray)) {
return INDEX_NOT_FOUND; return INDEX_NOT_FOUND;
} }
if(endInclude < 0){ if (endInclude < 0) {
endInclude += array.length; endInclude += array.length;
} }
if(endInclude < 0){ if (endInclude < 0) {
return INDEX_NOT_FOUND; return INDEX_NOT_FOUND;
} }
if(endInclude > array.length - 1){ if (endInclude > array.length - 1) {
// 结束位置超过最大值 // 结束位置超过最大值
endInclude = array.length - 1; endInclude = array.length - 1;
} }
if(subArray.length - 1 > endInclude){ if (subArray.length - 1 > endInclude) {
// 剩余长度不足 // 剩余长度不足
return INDEX_NOT_FOUND; return INDEX_NOT_FOUND;
} }
final int firstIndex = lastIndexOf(array, subArray[0], endInclude); for (int i = Math.min(array.length - subArray.length, endInclude); i >= 0; i--) {
if (firstIndex < 0 || firstIndex + subArray.length > array.length) { 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 INDEX_NOT_FOUND; 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);
}
}
return firstIndex;
}
// O(n)时间复杂度检查数组是否有序 // O(n)时间复杂度检查数组是否有序
/** /**