大家好,很高兴能和你认识,这是本人第一篇博文,本着提升自我而开始的博客之旅
下面只要写的是java字符串重排后是否相等的。
public static void main(String [] args){
String str1 = " hello World ";
String str2 = "llo World he";
boolean res = false;
for(int i = 0; i < 50; i++){
res = asEquals(str1, str2);
}
System.out.println(res);
}
方案一:直接使用java jdk自带api
分析:判断两个字符串是否相等,把两个字符串重新排列(升序、降序),然后做比较
第一步:判断两个字符串是否相等,
第二步:判断两个字符串是否为空
第三步:判断字符串长度是否相等
第四步:把两个字符串转为数组,给数组排序,直接排序后是否相等
完成。
api:Arrays
Arrays.sort(obj []); //数组排序
Arrays.equals(arr1, arr2); // 判断两个数组相等
//Arrays.equals() 实现如下
public static boolean equals(byte[] a, byte[] a2) {
if (a==a2)
return true;
if (a==null || a2==null)
return false;
int length = a.length;
if (a2.length != length)
return false;
for (int i=0; i<length; i++)
if (a[i] != a2[i])
return false;
return true;
}
static boolean asEquals(String str1, String str2){
if(str1 == str2)
return true;
if (str1 == null || str2 == null)
return false;
if(str1.length() != str2.length())
return false;
byte[] arr1 = str1.getBytes();
byte[] arr2 = str2.getBytes();
Arrays.sort(arr1);
Arrays.sort(arr2);
return Arrays.equals(arr1, arr2);
}
方案二:定义两个可以放下所有字符的数组把两个字符串
中字符出现的次数装起来,循环判断是否相等
分析:所有字符总数为256,定义两个256的数组,下标分别表示字符的ASCII值,对应数值表示出现次数,
static boolean asEquals2(String str1, String str2) {
if(str1 == str2) return true;
//两字符串存在空的情况
if (str1 == null || str2 == null) return false;
/** * 两字符串都不为空 * 长度不相等则直接返回false */
int len = str1.length();
if (len != str2.length()) return false;
int[] strA = new int[256];
int[] strB = new int[256];
for(int i = 0; i < len; i++){
strA[str1.charAt(i)]++;
strB[str2.charAt(i)]++;
}
//遍历数组所有元素,进行对比
for (int i = 0; i < 256; i++){
if (strA[i] != strB[i]) return false;
}
return true;
}
方案三:定义一个可以放下所有字符的数组把一个字符串中字符出现的次数装起来,然后循环另一个字符串,没出现一次则--,如果--后小于0表示字符串A的这个字符比字符串B少
static boolean asEquals3(String str1, String str2) {
if(str1 == str2)
return true;
if (str1 == null || str2 == null)
return false;
int len = str1.length();
if (len != str2.length())
return false;
int[] strA = new int[256];
for(int i = 0; i < len; i++){
strA[str1.charAt(i)]++;
}
for (int i = 0; i < len; i++){
if (--strA[str2.charAt(i)] < 0)
return false;
}
return true;
}
总结:经过测试在
字符串比较短的情况下,方案一和三耗时较少
字符串较长的情况下,方案二和三耗时较少
优化:方案二和三可以考虑根据字符串长度选择用二或三(是否大于某个值,目的是减少循环的次数)
以上为本人少少挫见,如有错误希望大神指正,或提出更好的方案。
--有志者事竟成。