Java删除输入的字符串中重复的元素
使用数组的相关操作删除所输入的字符串中的重复元素
在学习数组的相关知识后我开始尝试写一点有趣的东西来巩固自己学习的内容,所以我打算在本篇博客里分享一下如何利用数组并删除数组里重复的元素。
所用到的数组知识主要是数组的遍历,和数组的删除操作。
不说那么多了,先上我写好的代码,然后分析。
//删除字符串中重复内容
import java.util.*;
public class Demo02{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入一串字符串,系统将会检查重复并抹除重复:");
String str=sc.nextLine();
int len=str.length();
char[] arr=new char[len];
//遍历字符串,并把值 放入arr中
for(int i=0;i<len;i++){
arr[i]=str.charAt(i);
}
for(char x:arr){
System.out.print(x+"\t");
}
char temp=0;
//遍历字符串,检查重复
for(int i=0;i<len-1;i++){
temp=arr[i];
for(int j=i+1;j<len;j++){
if(temp==arr[j]){//检查是否重复
for(int k=j;k<len-1;k++){//抹除重复
arr[k]=arr[k+1];
}
arr[len-1]='0';
len--;
j--;
}
}
}
System.out.println();
for(char x:arr){
System.out.print(x+"\t");
}
System.out.println();
for(int i=0;i<len;i++){
System.out.print(arr[i]+"\t");
}
}
}
我们在运行时输入n多重复字母:aaabbbccc…zz,结果如下:
代码分析
上诉代码中我们使用了一个char数组用来容纳字符串里“拆”下来的元素,然后使用嵌套for循环用于判断是否存在重复元素,原理是内层元素一一与外层循环选定的元素做比较,如果发现了重复则执行抹除工作,抹除的起点是内层循环匹配到的与外层循环重复的下标。
每次执行抹除操作后,被磨除元素后的元素会整体前移动一次,所以我们让内层循环控制条件j在每次执行抹除重复的操作后自减一进行后退操作。
每次执行抹除后我们用’0’重置了末尾的冗余数据,这样就会造成大量重复的0元素的存在,会使我们的判读重复的嵌套循环陷入死循环中,又由于数组长度的不可变性,所以我们提前使用一个变量len记录了数组的长度,我们使用len来防止每次置0后判断重复的循环扫描到0及其以后的元素,所以我们让len也在执行抹除操作后自减一,这样判断循环的嵌套循环就不会遇到我们特意用来抹除冗余的0元素。
同样为了输出美观,不再输出我们用来抹除冗余的0元素,我们可以在遍历输出数组元素的循环条件里让循环控制条件 i 的上限为 len ,这样我们只会输出剩下的非重复元素!
以上便是我学习数组后做的一个用于删除重复元素的小程序,在那个双层for循环中我们使用变量temp的原因是为了减少一次访问堆的次数,众所周知,程序访问堆的时间远大于访问栈的时间,所以为了提升一点程序的性能,我在循环里特意在栈里定义了一个变量temp当作容器放在循环里用于提升循环性能。