java面試題:陣列去重
面試中遇到一道筆試題,寫一個數組去重的方法。
- 方法一
我們可以建立一個空的List,遍歷陣列,依次將陣列中的值傳入List,利用List的 contains()方法,如果List已經包含當前遍歷到的陣列元素,則不新增進List,保證其唯一性;用List的toArray()方法把集合轉換成陣列。
public static void duplicateRemovalByList(String [] arrStr) { List<String> list = new ArrayList<String>(); for (int i=0; i<arrStr.length; i++) { if(!list.contains(arrStr[i])) { list.add(arrStr[i]); } } String[] newArrStr = list.toArray(new String[1]); System.out.println(Arrays.toString(newArrStr)); }
- 方法二
利用Map集合鍵的不可重複性,遍歷陣列,把每個陣列元素都傳進Map集合,得到亂序而不重複的Map集合;再用Map的keySet().toArray()方法把集合轉換成陣列。
public static void duplicateRemovalByMap(String [] arrStr) { Map<String, Object> map = new HashMap<String, Object>(); 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<Object> link = new LinkedHashSet<Object>();
for (int i = 0; i < arr.length; i++) {
link.add(arr[i]);
}
Iterator<Object> iterator = link.iterator();
System.out.println(link);
/*
* while (iterator.hasNext()) { System.out.print(iterator.next()+" "); }
*/
}
鳶飛戾天,經綸世務
&