1.题目描述
有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,
- 找出给定字符串(肯定不是空字符串)的索引。
2. 代码实现
public class Demo1 {
public static void main(String[] args) {
String[] arr = { "a", "", "ac", "", "ad", "b", "", "ba" };
int res = indexOf(arr, "abc");
System.out.println(res);
}
private static int indexOf(String[] arr, String p) {
int begin = 0;
int end = arr.length - 1;
while (begin <= end) {
int indexOfMid = begin + ((end - begin) >> 1);
while (arr[indexOfMid].equals("")) {
indexOfMid++;
// 千万要注意
if (indexOfMid > end) {
return -1;
}
}
if (arr[indexOfMid].compareTo(p) > 0) {
end = indexOfMid - 1;
} else if (arr[indexOfMid].compareTo(p) < 0) {
begin = indexOfMid + 1;
} else {
return indexOfMid;
}
}
return -1;
}
}
3.java中的compareto方法的详细介绍
- 返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值
String a1 = "a";
String a2 = "c";
System.out.println(a1.compareTo(a2));//结果为-2
- 即参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,返回该不同的字符的asc码差值
String a1 = "aa";
String a2 = "ad";
System.out.println(a1.compareTo(a2));//结果为-3
- 如果两个字符串不一样长,并且可以参与比较的字符又完全一样,则返回两个字符串的长度差值
String a1 = "aa";
String a2 = "aa12345678";
System.out.println(a1.compareTo(a2));//结果为-8
注意
:参与比较的字符如果不完全一样,数量一样的字符串
String a1 = "aa";
String a2 = "ad12345678";
System.out.println(a1.compareTo(a2));//结果为-3
返回为正数表示a1>a2, 返回为负数表示a1<a2, 返回为0表示a1==a2
;- 数字类型不能用compareTo,nt跟int的比较不能用compareTo方法,
直接用大于(>) 小于(<) 或者 等于(==) 不等于(!=)
来比较即可
int num1 = 4;
int num2 = 5;
num1.compareTo(num2);//Cannot invoke compareTo(int) on the primitive type int
可以先转为字符串类型在进行比较,直接+双引号
就可以转为字符串
- compareToIgnoreCase忽略大小写
- int型可以直接比较,所以没有用到compareTo比较,如果声明的是Date、String、Integer、或者其他的,可以直接使用compareTo比较,
Integer n1 = 5;
Integer n2 = 6;
System.out.println(n1.compareTo(n2));//-1