1. 程式人生 > >java面試題:陣列去重

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()+" "); }
		 */  
    } 

                                                                                                                                                                                                                             

                                                                                                                                                                                                                                                                                                                                                                                                                              鳶飛戾天,經綸世務

                                                                                                                                                                                                      &