package utils.find; import java.lang.reflect.Array; /** * ArrayUtil <br/> * Generated on: 2010.05.07 * * @author loocao */ public class ArrayUtil { /** * @param args */ public static void main(String[] args) { String[] arrString = new String[] { "abc0", "cde1", "efg2", "hij3", "lmn4", "opq5", "rst6", "uvw7", "xyz8" }; String findStr = "rst6"; System.out.println(indexOfStringArray(arrString, findStr)); } /** * 从已排好序的String数组中查询要搜索的字符串的下标 * * @param args * 已经排序的字符串数组 * @param findStr * 要查找的字符串 * @return 字符串所在<b>下标<b> */ public static int indexOfStringArray(String[] args, String findStr) { if (findStr == null || args == null || args.length == 0) return -1; int index = args.length % 2 == 0 ? args.length / 2 : (args.length - 1) / 2; if (args[index].equals(findStr)) { return index; } else { int temp, result = 0, start = 0, length = 0; if (findStr.compareTo(args[index]) < 0) { start = 0; length = index;// index之前的数组长度 temp = indexOfStringArray(subArray(args, start, length), findStr); result = temp; } else if (findStr.compareTo(args[index]) > 0) { start = index + 1; length = args.length - start;// index之后的数组length temp = indexOfStringArray(subArray(args, start, length), findStr); if (temp == -1) result = temp; else result = temp + index + 1; } return result; } } /** * 截取数组 * * 感谢enihs( http://hi.csdn.net/shine333 )指点, * System.arraycopy: http://doc.java.sun.com/DocWeb/api/java.lang.System?lang=zh_cn&mode=Read#T3 * * @param c * args数组中元素的类型class * @param args * 要截取的数组 * @param start * 开始下标 * @param length * 要复制的数组长度 * @return args 中下标从 start 到 start+length-1 的数组 */ @SuppressWarnings("unchecked") public static <T> T[] subArray(T[] args, int start, int length) { T[] temp = (T[]) Array.newInstance(args.getClass().getComponentType(), length); // for (int i = start; i <= start + length - 1; i++) { // temp[i - start] = args[i]; // } // 将数组args从start到length-1复制到temp中,由enihs指点 System.arraycopy(args, start, temp, 0, length); return temp; } }