面试中遇到一道笔试题,写一个数组去重的方法。
- 方法一
我们可以创建一个空的List,遍历数组,依次将数组中的值传入List,利用List的 contains()方法,如果List已经包含当前遍历到的数组元素,则不添加进List,保证其唯一性;用List的toArray()方法把集合转换成数组。
public static void duplicateRemovalByList(String [] arrStr) {
List list = new ArrayList();
for (int i=0; i
- 方法二
利用Map集合键的不可重复性,遍历数组,把每个数组元素都传进Map集合,得到乱序而不重复的Map集合;再用Map的keySet().toArray()方法把集合转换成数组。
public static void duplicateRemovalByMap(String [] arrStr) {
Map map = new HashMap();
for (String str : arrStr) {
map.put(str, str);
}
String[] newArrStr = map.keySet().toArray(new String[1]);
System.out.println(Arrays.toString(newArrStr));
}
- 方法三
利用数组去重,先创建一个新的数组B,与原数组A等长,先不传入值(则B = { null , null , null , ... , null });立一个flag并遍历A,依次取A中每一个值与B中所有值作比较,一旦值比较出相等的,则flag设false,当A中这一个值与B中所有值比较完之后,flag如果还是true,则把A的当前值传给B,如为false则不做操作,进入下一轮循环,保证唯一性;当遍历完A后,得到一个等长、无重复的B(末尾可能有多个null值),并得到末位非null的索引值index;创建新数组C,长度为index,遍历B数组(仅取到索引为index),传入C。
public static void duplicateRemovalByArr() {
Integer[] arr = { 1, 1, 2, 3 };
Integer[] tmp = new Integer[arr.length];
int m = 0;
for (int i = 0; i < arr.length; i++) {
// 判断tmp数组是否存在
boolean flag = true;
for (int n = 0; n < tmp.length; n++) {
if (tmp[n] == arr[i]) {
// 如果有相等的,设置为flase
flag = false;
}
}
if (flag) {
tmp[m++] = arr[i];
}
}
// list去重
Integer[] newArr = new Integer[m];
// 检测数组有多少为null,并且赋值为新的数组
for (int k = 0; k < m; k++) {
newArr[k] = tmp[k];
}
tmp = newArr;
System.out.println(Arrays.toString(tmp));
}
- 方法四
实例化一个Set集合,遍历数组并存入集合,如果元素已存在则不会重复存入,最后返回Set集合的数组形式。
public static Object[] duplicateRemovalBySet(Object[] arr){
Set set = new HashSet();
for (int i = 0; i < arr.length; i++) {
set.add(arr[i]);
}
return set.toArray();
}
- 方法五
通过链表去重,遍历数组,传入LinkedHashSet,得到无重复的元素集合;创建迭代器,迭代集合。
public static void duplicateRemovalByLink(Object[] arr){
LinkedHashSet
鸢飞戾天,经纶世务
2019年7月30日