不保证原有顺序:
public static void main(String[] args) {
String str = "abbddcaaaddfertsdf232122dsdfdsftwesdfdzxcssdfffggaasb";
str = removedb ( str , 0 ) ;
System.out.println ( "去重后:"+str );
}
public static String removedb(String word,int index){
char[] words = word.toCharArray();
if(index>=word.length()-1){ //判断当前index是否是字符串最后一位
return word;
}
String w = String.valueOf(words[index]); //当前比较的字符转成字符串
word=w.concat(word.replaceAll(w,"")); //将所有与比较字符w相同的内容去掉,再将比较字符w拼回去
return removedb(word,index+1); //递归调用,index+1比较下一个字符。
}
控制台输出:
去重后:gxzw132strefcdba
保证原有顺序,且统计出重复字符的重复数量:
public static void main(String[] args) {
String str = "abbddcaaaddfertsdf232122dsdfdsftwesdfdzxcssdfffggaasb";
str = String . valueof( removedb2 ( str.toCharArray(), 0 )) .replaceAll(" ","");
System.out.println ("去重后:"+ str );
}
public static char[] removedb2(char[] word,int index){
int num=0;
if(index>=word.length-1){
return word;
}
if(word[index]!=' '){
for(int i=index;i<=word.length-1;i++){ //遍历字符数组
if(word[i]==word[index]){ //比较当前遍历字符与判重字符是否相同
num++;
if(num>1){ //忽略第一位
word[i]=' '; //将相同的字符赋值为' '空格串。
}
}
}
if ( num>1 )
System.out.println(word[index]+"的重复数量为:"+(num-1));
}
return removedb2(word,index+1); //递归调用,index+1比较下一个字符。
}
控制台输出:
a的重复数量为:5
b的重复数量为:2
d的重复数量为:10
c的重复数量为:1
f的重复数量为:7
e的重复数量为:1
t的重复数量为:1
s的重复数量为:6
2的重复数量为:3
g的重复数量为:1
去重后:abdcferts231wzxg
改善方案,排除已替换为‘ ’空格串的数组下标,减少递归次数:
public static char[] removedb2(char[] word,int index){
int num=0;
if(index>=word.length-1){
return word;
}
for(int i=index;i<=word.length-1;i++){
if(word[i]==word[index]){
num++;
if(num>1){
word[i]=' ';
}
}
}
if(num>1)
System.out.println(word[index]+"的重复数量为:"+(num-1));
while(word[++index]==' '&&index<word.length-1){ //比较字符数组下一位下标的字符是否为‘ ’
}
return removedb2(word,index);
}