2014-10-06 25 views
0

假設我有兩個數組;從另一個數組中的數組中保留數組中的特定元素

Integer[] array= { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 200, 5, 6, 5 }; 
Integer[] array2= { 12, 2 ,3, 2, 200, 5 }; 

我試着做,與除了那些誰是也存在於數組2卸下的所有元素返回數組的方法,所以這種方法的輸出應該

{2 ,3, 5, 200, 5, 5 } 

我不想使用另一種數據結構,我不知道如何編寫什麼即時試圖做的,林不知道我怎麼能確定的結果數組長度

感謝

+1

你會怎麼做_conceptually_? – 2014-10-06 01:28:02

+3

_「我不知道如何編碼我試圖做的事情」 - 花點時間在代碼之外思考它,然後拿出代碼來匹配你的想法。因爲它聽起來有點像家庭作業問題... – Krease 2014-10-06 01:35:53

+0

可能的[兩個列表中的通用元素]的重複(http://stackoverflow.com/questions/5943330/common-elements-in-two-lists) – 2014-10-06 01:40:44

回答

1

如果我理解你的問題,你可以從創建contains(Integer[], Integer)方法開始。迭代數組並返回true如果數組包含該值。

private static boolean contains(Integer[] a, Integer v) { 
    for (Integer t : a) { 
     if (t.equals(v)) { 
      return true; 
     } 
    } 
    return false; 
} 

然後你可以利用它來迭代你的數組兩次。一次執行計數,第二次用count元素數填充新創建的數組。喜歡的東西,

public static Integer[] retainAll(Integer[] a, Integer[] b) { 
    int count = 0; 
    for (Integer val : a) { 
     if (contains(b, val)) { 
      count++; 
     } 
    } 
    Integer[] out = new Integer[count]; 
    count = 0; 
    for (Integer val : a) { 
     if (contains(b, val)) { 
      out[count++] = val; 
     } 
    } 
    return out; 
} 

然後對其進行測試,

public static void main(String[] args) { 
    Integer[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 200, 5, 6, 5 }; 
    Integer[] array2 = { 12, 2, 3, 2, 200, 5 }; 
    System.out.println(Arrays.toString(retainAll(array, array2))); 
} 

輸出被請求的過程

[2, 3, 5, 200, 5, 5] 

,你也可以使用Arrays.asList(T...)retainAll()

public static Integer[] retainAll(Integer[] a, Integer[] b) { 
    List<Integer> al = new ArrayList<>(Arrays.asList(a)); 
    al.retainAll(Arrays.asList(b)); 
    return al.toArray(new Integer[al.size()]); 
} 
+0

謝謝但Integer val是什麼? – 2014-10-06 01:59:15

+1

@BobJ這是一個['For-Each' Loop](http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html)。 – 2014-10-06 02:04:01

+0

@BobJ - 我的代碼幾乎與艾略特一樣,除了一些小的檢查和一個額外的方法來刪除重複。 – 2014-10-06 06:25:50

2

這是一個只使用數組而沒有其他數據結構的解決方案。 retainAll方法將返回一個數組,其中包含一些空值。你可以創建一些代碼來使用該數組並創建一個沒有空值的數組。它非常簡單。

import java.util.Arrays; 

public class Test { 

    public static void main(String[] args) { 
     Integer[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 200, 5, 6, 5 }; 
     Integer[] array2 = { 12, 2, 3, 2, 200, 5 }; 

     Integer[] res = retainAll(array, array2); 
     String str = Arrays.toString(res); 
     System.out.println(str); 
     res = removeArrayDuplicates(res); 
     str = Arrays.toString(res); 
     System.out.println(str); 

    } 

    public static Integer[] retainAll(Integer[] a, Integer[] b) { 

     int ln1 = a.length; 
     int ln2 = b.length; 

     Integer[] res = new Integer[(ln1 < ln2) ? ln1 : ln2]; 
     Integer[] small = (ln1 < ln2) ? a : b; 
     Integer[] big = (ln1 < ln2) ? b : a; 

     boolean found = false; 

     for (int i = 0; i < small.length; i++) { 
      found = arrayContains(big, small[i]); 
      if (found == true) { 
       res[i] = small[i]; 
      } 

     } 

     return res; 

    } 

    public static Integer[] removeArrayDuplicates(Integer[] a) { 

     int len = a.length; 
     int dups = 0; 
     boolean noNulls = false; 

     for (int i = 0; i < len; i++) { 

      for (int j = i + 1; j < len; j++) { 

       noNulls = a[i] != null && a[j] != null; 

       if (noNulls && a[i].equals(a[j])) { 
        a[j] = null; 
        dups++; 
       } 
      } 

     } 

     return a; 

    } 

    public static boolean arrayContains(Object[] a, Integer b) { 
     boolean contains = false; 

     for (Object c : a) { 
      if (c != null && c.equals(b)) { 
       contains = true; 
       break; 
      } 
     } 

     return contains; 
    } 

} 
相關問題