假如有下面这样一个数组,怎么给它去重?
Integer[] arrs = new Integer[]{2,5,3,3,2,4,5};
稍微有点经验的人可能会说什么算法呀,集合类呀,吧啦吧啦说一堆......
你配钥匙吗?
我不配!
其实数组去重的方式有很多,下面就来分别演示一下几种去重方式:
- 最基础的实现方式
public static Integer[] primitive(Integer[] arrays){
Integer[] temp = new Integer[arrays.length];
for (int i = 0; i < arrays.length; i++) {
boolean flag = true;
for (int j = i + 1; j < arrays.length; j++) {
if (arrays[i].equals(arrays[j])) {
flag = false;
break;
}
}
if (flag) {
temp[i] = arrays[i];
}
}
return temp;
}
像上面这样是可以实现,但是不严谨,因为临时数组的长度不好确定,而且返回的临时数组部分元素会是 null,所以可以考虑使用List来代替临时数组,改变之后就是下面这样:
public static List primitive(Integer[] arrays){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arrays.length; i++) {
boolean flag = true;
for (int j = i + 1; j < arrays.length; j++) {
if (arrays[i].equals(arrays[j])) {
flag = false;
break;
}
}
if (flag) {
list.add(arrays[i]);
}
}
return list;
}
- 有没有其他稍微简单一点的实现方式呢?既然上面的方式已经使用了集合,那有没有可以使用集合来实现的呢?
- 纯List实现:List中的元素允许重复,所以要判断一下是否已有该元素
public static List deduplicationByList(Integer[] arrays){
List<Integer> list = new ArrayList<>();
for (int i = 0; i < arrays.length; i++) {
if (!list.contains(arrays[i])){
list.add(arrays[i]);
}
}
return list;
}
- 使用 Map 实现:Map 的 key 不允许重复,所以可以使用 key 来去重
public static Set deduplicationByMap(Integer[] arrays) {
Map map = new HashMap();
for (int i = 0; i < arrays.length; i++) {
map.put(arrays[i], new Object());
}
return map.keySet();
}
- 使用 Set 实现:Set 不允许有重复元素
public static Set<Integer> deduplicationBySet(Integer[] arrays){
Set<Integer> set = new HashSet<>();
for (int i = 0; i < arrays.length; i++) {
set.add(arrays[i]);
}
return set;
}
其实 Set 和 Map的原理是差不多的,因为 HashSet 的底层实现就是基于 HashMap 的,综合上述几个实现来讲,可能最受欢迎的就是最后一个了吧!
但是面试的时候可不单单是这么简单哟,各个集合类的底层实现最好比较熟悉,这三个集合类里最复杂的应该就是 HashMap 的底层实现了吧,又是拉链式散列算法又是红黑树的,所以还是好好努力吧!
网友评论