数组去重的几种方法:
方法一:list集合
只需要创建一个集合,然后遍历数组逐一放入集合,只要在放入之前用contains()方法判断一下集合中是否已经存在这个元素就行了,然后用toArray转成数组一切搞定。
public static void ifRepeatList(Object[] arr) {
//创建一个集合
List list = new ArrayList();
for (int i = 0; i < arr.length; i++) {
//判断集合里面有的元素,把不相同的元素往集合里面放
//(判断某个元素是不是选定元素的子元素或者本身)
if (!list.contains(arr[i])) {
list.add(arr[i]);
}
}
//toArray()方法将集合转换成数组
Object[] newarr = list.toArray();
/* for (int i = 0; i <newarr.length ; i++) {
System.out.println(" "+newarr[i]);
}*/
System.out.println("方法一:"+Arrays.toString(newarr));
}
方法二:数组嵌套循环
需要一个存储去重后元素的数组,然后两层循环,外层遍历原数组,内容逐个判断是否和之后的元素重复,然后再提出来存入新的数组。方法System.arraycopy(被复制的数组,起始下标,接收的新数组,起始下标,结束下标);可以直接复制数组,既然这样,我就没必要纠结新数组的长度了,直接声明一个跟原数组长度一样的临时数组,只要记录下去重后的元素个数,然后就可以确定去重后数组长度再去将临时数组拷贝到新数组就行了
public static Object[] ifRepeatByArr(Object[] arr){
//创建一个新的数组,长度和原数组的长度一致
Object[] temparr=new Object[arr.length];
//用来记录去除重复之后的数组长度和给临时数组作为下标索引
int m=0;
//遍历原数组
for (int i = 0; i <arr.length ; i++) {
//声明一个flag
boolean flag=true;
//内层循环将原数组逐个比较
for (int j = i+1; j <arr.length ; j++) {
//如果发现有重复元素,则将flag的状态改为false,并结束该次内层循环
if (arr[i]==arr[j]){
flag=false;
break;
}
}
//判断flag是否被改变,如果没有就是没有重复元素
if (flag){
//将原数组的元素赋值给临时的数组
temparr[m]=arr[i];
//走到这里说明当前数组没有重复元素,那么记录自增:m++
m++;
}
}
//声明需要返回的数组,这个数组就是去重后的数组
Object[] newarr = new Object[m];
//用arraycopy方法将刚才去重的数组拷贝到新数组并返回
System.arraycopy(temparr,0,newarr,0,m);
return newarr;
}
方法三:map集合
利用Map集合键的不可重复性,遍历数组,把每个数组元素都传进Map集合,得到乱序而不重复的Map集合;再用Map的keySet().toArray()方法把集合转换成数组
public static void ifRepeatMap(Object[] arr) {
//创建一个map集合
Map<String, Object> map = new HashMap<>();
//遍历数组,利用map集合的不可重复特性,去掉重复元素,将没有重复的元素放入map集合中
for (Object obj : arr) {
map.put((String) obj,obj);
}
//利用keySet().toArray()方法将集合转换为数组
Object[] newarr = map.keySet().toArray(new Object[1]);
System.out.println("方法三:"+Arrays.toString(newarr));
}
方法四:set集合
最简单的方法就是利用Set集合无序不可重复的特性进行元素过滤。
public static void ifRepeatSet(Object[] arr){
//实例化一个set集合
HashSet set=new HashSet();
//遍历数组并存入集合,如果元素已存在则不会重复存入
for (int i = 0; i <arr.length ; i++) {
set.add(arr[i]);
}
Object[] newarr = set.toArray();
System.out.println("方法四:"+Arrays.toString(newarr));
}
方法五:LinkedHashSet(有序,不可重复)
通过链表去重,遍历数组,传入LinkedHashSet,得到无重复的元素集合;创建迭代器,迭代集合。(链表的哈希集合:有顺序,不重复)
public static void ifRepeatLinkHashSet(Object[] arr){
LinkedHashSet hashSet=new LinkedHashSet();
for (int i = 0; i <arr.length ; i++) {
hashSet.add(arr[i]);
}
//创建迭代器
Iterator iterator=hashSet.iterator();
System.out.println("方法五:"+hashSet);
}
测试:
public static void main(String[] args) {
String[] arr = {"a", "b", "c", "c", "d", "e", "e", "e", "a"};
//方法一
ifRepeatList(arr);
System.out.println("********分割线**********");
//方法二
System.out.println("方法二:"+Arrays.toString(ifRepeatByArr(arr)));
System.out.println("********分割线**********");
//方法三
ifRepeatMap(arr);
System.out.println("********分割线**********");
//方法四
ifRepeatSet(arr);
System.out.println("********分割线**********");
//方法五
ifRepeatLinkHashSet(arr);
}