Here you can find the source of arrayLastIndexOf(Object[] array, Object objectToFind)
public static int arrayLastIndexOf(Object[] array, Object objectToFind)
//package com.java2s; /**/*from w w w. j av a 2 s. c o m*/ * Copyright (c) 1997-2013, www.tinygroup.org (luo_guo@icloud.com). * * Licensed under the GPL, Version 3.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.gnu.org/licenses/gpl.html * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ public class Main { public static int arrayLastIndexOf(Object[] array, Object objectToFind) { return arrayLastIndexOf(array, objectToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(Object[] array, Object[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(Object[] array, Object objectToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } if (objectToFind == null) { for (int i = startIndex; i >= 0; i--) { if (array[i] == null) { return i; } } } else { for (int i = startIndex; i >= 0; i--) { if (objectToFind.equals(array[i])) { return i; } } } return -1; } public static int arrayLastIndexOf(long[] array, long longToFind) { return arrayLastIndexOf(array, longToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(long[] array, long[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(long[] array, long longToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (longToFind == array[i]) { return i; } } return -1; } public static int arrayLastIndexOf(long[] array, long[] arrayToFind, int startIndex) { if (array == null || arrayToFind == null) { return -1; } int sourceLength = array.length; int targetLength = arrayToFind.length; int rightIndex = sourceLength - targetLength; if (startIndex < 0) { return -1; } if (startIndex > rightIndex) { startIndex = rightIndex; } if (targetLength == 0) { return startIndex; } int lastIndex = targetLength - 1; long last = arrayToFind[lastIndex]; int min = targetLength - 1; int i = min + startIndex; startSearchForLast: while (true) { while (i >= min && array[i] != last) { i--; } if (i < min) { return -1; } int j = i - 1; int start = j - (targetLength - 1); int k = lastIndex - 1; while (j > start) { if (array[j--] != arrayToFind[k--]) { i--; continue startSearchForLast; } } return start + 1; } } public static int arrayLastIndexOf(int[] array, int intToFind) { return arrayLastIndexOf(array, intToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(int[] array, int[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(int[] array, int intToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (intToFind == array[i]) { return i; } } return -1; } public static int arrayLastIndexOf(int[] array, int[] arrayToFind, int startIndex) { if (array == null || arrayToFind == null) { return -1; } int sourceLength = array.length; int targetLength = arrayToFind.length; int rightIndex = sourceLength - targetLength; if (startIndex < 0) { return -1; } if (startIndex > rightIndex) { startIndex = rightIndex; } if (targetLength == 0) { return startIndex; } int lastIndex = targetLength - 1; int last = arrayToFind[lastIndex]; int min = targetLength - 1; int i = min + startIndex; startSearchForLast: while (true) { while (i >= min && array[i] != last) { i--; } if (i < min) { return -1; } int j = i - 1; int start = j - (targetLength - 1); int k = lastIndex - 1; while (j > start) { if (array[j--] != arrayToFind[k--]) { i--; continue startSearchForLast; } } return start + 1; } } public static int arrayLastIndexOf(short[] array, short shortToFind) { return arrayLastIndexOf(array, shortToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(short[] array, short[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(short[] array, short shortToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (shortToFind == array[i]) { return i; } } return -1; } public static int arrayLastIndexOf(short[] array, short[] arrayToFind, int startIndex) { if (array == null || arrayToFind == null) { return -1; } int sourceLength = array.length; int targetLength = arrayToFind.length; int rightIndex = sourceLength - targetLength; if (startIndex < 0) { return -1; } if (startIndex > rightIndex) { startIndex = rightIndex; } if (targetLength == 0) { return startIndex; } int lastIndex = targetLength - 1; short last = arrayToFind[lastIndex]; int min = targetLength - 1; int i = min + startIndex; startSearchForLast: while (true) { while (i >= min && array[i] != last) { i--; } if (i < min) { return -1; } int j = i - 1; int start = j - (targetLength - 1); int k = lastIndex - 1; while (j > start) { if (array[j--] != arrayToFind[k--]) { i--; continue startSearchForLast; } } return start + 1; } } public static int arrayLastIndexOf(byte[] array, byte byteToFind) { return arrayLastIndexOf(array, byteToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(byte[] array, byte[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(byte[] array, byte byteToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (byteToFind == array[i]) { return i; } } return -1; } public static int arrayLastIndexOf(byte[] array, byte[] arrayToFind, int startIndex) { if (array == null || arrayToFind == null) { return -1; } int sourceLength = array.length; int targetLength = arrayToFind.length; int rightIndex = sourceLength - targetLength; if (startIndex < 0) { return -1; } if (startIndex > rightIndex) { startIndex = rightIndex; } if (targetLength == 0) { return startIndex; } int lastIndex = targetLength - 1; byte last = arrayToFind[lastIndex]; int min = targetLength - 1; int i = min + startIndex; startSearchForLast: while (true) { while (i >= min && array[i] != last) { i--; } if (i < min) { return -1; } int j = i - 1; int start = j - (targetLength - 1); int k = lastIndex - 1; while (j > start) { if (array[j--] != arrayToFind[k--]) { i--; continue startSearchForLast; } } return start + 1; } } public static int arrayLastIndexOf(double[] array, double doubleToFind) { return arrayLastIndexOf(array, doubleToFind, Integer.MAX_VALUE, 0); } public static int arrayLastIndexOf(double[] array, double doubleToFind, double tolerance) { return arrayLastIndexOf(array, doubleToFind, Integer.MAX_VALUE, tolerance); } public static int arrayLastIndexOf(double[] array, double[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE, 0); } public static int arrayLastIndexOf(double[] array, double[] arrayToFind, double tolerance) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE, tolerance); } public static int arrayLastIndexOf(double[] array, double doubleToFind, int startIndex) { return arrayLastIndexOf(array, doubleToFind, startIndex, 0); } public static int arrayLastIndexOf(double[] array, double doubleToFind, int startIndex, double tolerance) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } double min = doubleToFind - tolerance; double max = doubleToFind + tolerance; for (int i = startIndex; i >= 0; i--) { if (array[i] >= min && array[i] <= max) { return i; } } return -1; } public static int arrayLastIndexOf(double[] array, double[] arrayToFind, int startIndex) { return arrayLastIndexOf(array, arrayToFind, startIndex, 0); } public static int arrayLastIndexOf(double[] array, double[] arrayToFind, int startIndex, double tolerance) { if (array == null || arrayToFind == null) { return -1; } int sourceLength = array.length; int targetLength = arrayToFind.length; int rightIndex = sourceLength - targetLength; if (startIndex < 0) { return -1; } if (startIndex > rightIndex) { startIndex = rightIndex; } if (targetLength == 0) { return startIndex; } int lastIndex = targetLength - 1; double lastMin = arrayToFind[lastIndex] - tolerance; double lastMax = arrayToFind[lastIndex] + tolerance; int min = targetLength - 1; int i = min + startIndex; startSearchForLast: while (true) { while (i >= min && (array[i] < lastMin || array[i] > lastMax)) { i--; } if (i < min) { return -1; } int j = i - 1; int start = j - (targetLength - 1); int k = lastIndex - 1; while (j > start) { if (Math.abs(array[j--] - arrayToFind[k--]) > tolerance) { i--; continue startSearchForLast; } } return start + 1; } } public static int arrayLastIndexOf(float[] array, float floatToFind) { return arrayLastIndexOf(array, floatToFind, Integer.MAX_VALUE, 0); } public static int arrayLastIndexOf(float[] array, float floatToFind, float tolerance) { return arrayLastIndexOf(array, floatToFind, Integer.MAX_VALUE, tolerance); } public static int arrayLastIndexOf(float[] array, float[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE, 0); } public static int arrayLastIndexOf(float[] array, float[] arrayToFind, float tolerance) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE, tolerance); } public static int arrayLastIndexOf(float[] array, float floatToFind, int startIndex) { return arrayLastIndexOf(array, floatToFind, startIndex, 0); } public static int arrayLastIndexOf(float[] array, float floatToFind, int startIndex, float tolerance) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } float min = floatToFind - tolerance; float max = floatToFind + tolerance; for (int i = startIndex; i >= 0; i--) { if (array[i] >= min && array[i] <= max) { return i; } } return -1; } public static int arrayLastIndexOf(float[] array, float[] arrayToFind, int startIndex) { return arrayLastIndexOf(array, arrayToFind, startIndex, 0); } public static int arrayLastIndexOf(float[] array, float[] arrayToFind, int startIndex, float tolerance) { if (array == null || arrayToFind == null) { return -1; } int sourceLength = array.length; int targetLength = arrayToFind.length; int rightIndex = sourceLength - targetLength; if (startIndex < 0) { return -1; } if (startIndex > rightIndex) { startIndex = rightIndex; } if (targetLength == 0) { return startIndex; } int lastIndex = targetLength - 1; float lastMin = arrayToFind[lastIndex] - tolerance; float lastMax = arrayToFind[lastIndex] + tolerance; int min = targetLength - 1; int i = min + startIndex; startSearchForLast: while (true) { while (i >= min && (array[i] < lastMin || array[i] > lastMax)) { i--; } if (i < min) { return -1; } int j = i - 1; int start = j - (targetLength - 1); int k = lastIndex - 1; while (j > start) { if (Math.abs(array[j--] - arrayToFind[k--]) > tolerance) { i--; continue startSearchForLast; } } return start + 1; } } public static int arrayLastIndexOf(boolean[] array, boolean booleanToFind) { return arrayLastIndexOf(array, booleanToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(boolean[] array, boolean[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(boolean[] array, boolean booleanToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (booleanToFind == array[i]) { return i; } } return -1; } public static int arrayLastIndexOf(boolean[] array, boolean[] arrayToFind, int startIndex) { if (array == null || arrayToFind == null) { return -1; } int sourceLength = array.length; int targetLength = arrayToFind.length; int rightIndex = sourceLength - targetLength; if (startIndex < 0) { return -1; } if (startIndex > rightIndex) { startIndex = rightIndex; } if (targetLength == 0) { return startIndex; } int lastIndex = targetLength - 1; boolean last = arrayToFind[lastIndex]; int min = targetLength - 1; int i = min + startIndex; startSearchForLast: while (true) { while (i >= min && array[i] != last) { i--; } if (i < min) { return -1; } int j = i - 1; int start = j - (targetLength - 1); int k = lastIndex - 1; while (j > start) { if (array[j--] != arrayToFind[k--]) { i--; continue startSearchForLast; } } return start + 1; } } public static int arrayLastIndexOf(char[] array, char charToFind) { return arrayLastIndexOf(array, charToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(char[] array, char[] arrayToFind) { return arrayLastIndexOf(array, arrayToFind, Integer.MAX_VALUE); } public static int arrayLastIndexOf(char[] array, char charToFind, int startIndex) { if (array == null) { return -1; } if (startIndex < 0) { return -1; } else if (startIndex >= array.length) { startIndex = array.length - 1; } for (int i = startIndex; i >= 0; i--) { if (charToFind == array[i]) { return i; } } return -1; } public static int arrayLastIndexOf(char[] array, char[] arrayToFind, int startIndex) { if (array == null || arrayToFind == null) { return -1; } int sourceLength = array.length; int targetLength = arrayToFind.length; int rightIndex = sourceLength - targetLength; if (startIndex < 0) { return -1; } if (startIndex > rightIndex) { startIndex = rightIndex; } if (targetLength == 0) { return startIndex; } int lastIndex = targetLength - 1; char last = arrayToFind[lastIndex]; int min = targetLength - 1; int i = min + startIndex; startSearchForLast: while (true) { while (i >= min && array[i] != last) { i--; } if (i < min) { return -1; } int j = i - 1; int start = j - (targetLength - 1); int k = lastIndex - 1; while (j > start) { if (array[j--] != arrayToFind[k--]) { i--; continue startSearchForLast; } } return start + 1; } } }