2013-04-18 38 views
2

提示:給定一個int數組,如果數組包含旁邊的2或4旁邊的2,則返回true,但不是兩者都返回true。如何使用Arrays.asList()在數組上執行列表函數

我已經完成了這只是數組和沒有列表方法,但我想這樣做的做法。這是我的,Arrays.asList()給了我一些悲傷。

public boolean either24(int[] nums) 
{ 
    List list = Arrays.asList(nums); 
    boolean twos = list.containsAll(Arrays.asList(2, 2)); 
    boolean fours = list.containsAll(Arrays.asList(4, 4)); 
    return (twos || fours) && !(twos && fours); 
} 
Expected Run  
either24({1, 2, 2}) → true true OK  
either24({4, 4, 1}) → true true OK  
either24({4, 4, 1, 2, 2}) → false false OK  
either24({1, 2, 3, 4}) → false false OK  
either24({3, 5, 9}) → false false OK  
either24({1, 2, 3, 4, 4}) → true false X  
either24({2, 2, 3, 4}) → true false X  
either24({1, 2, 3, 2, 2, 4}) → true false X  
either24({1, 2, 3, 2, 2, 4, 4}) → false false OK  
either24({1, 2}) → false true X  
either24({2, 2}) → true true OK  
either24({4, 4}) → true true OK  
either24({2}) → false true X  
either24({}) → false false OK 

更新:部分問題是使用int而不是整數。新代碼:

public boolean either24(int[] nums) 
{ 
    Integer[] nums2 = new Integer[nums.length]; 
    for(int i = 0; i < nums.length; i++) 
     nums2[i] = nums[i]; 
    List list = Arrays.asList(nums2); 
    boolean twos = list.containsAll(Arrays.asList(2, 2)); 
    boolean fours = list.containsAll(Arrays.asList(4, 4)); 
    return (twos || fours) && !(twos && fours); 
} 

回答

1

試試這個:

public boolean either24(int[] nums) { 
    return (Arrays.toString(nums).contains("2, 2")^Arrays.toString(nums).contains("4, 4"));  
} 
2

問題是您正在使用containsAll方法。該文檔說:

如果此列表包含指定集合的​​所有元素,則返回true。

即使你在2正在傳遞的兩倍,它只是檢查,如果列表中包含2換句話說,它在說,「難道這份名單有兩個?好!請問這個名單有兩個?好」

3

containsAll()不檢查兩個元素是否彼此相鄰。它只檢查元素是否存在於列表中。您需要遍歷數組並檢查相鄰元素

 int [] nums = new int [] {1,2,3,4,2,3,2,2,1,-4,4,4}; 
     int len = nums.length; 
     for (int i = 0; i < len - 1 ; i++) 
     { 
      if((nums[i] == nums[i+1]) && (nums[i] == 2 || nums[i] == 4)) 
      { 
       System.out.println("Yes"); 
      } 
     } 

上面的代碼片段並未給出答案。你仍然需要處理問題的一部分,我將留給你。

-1
public static boolean is2or4(int[] nums){ 
    for (int i = 0; i < nums.length; i++) { 
     if(nums[i] == 2){ 
     return nums[i+1] == 2; 
     }else if(nums[i] == 4){ 
     return nums[i+1] == 4; 
     } 
    } 
    return false; 
    } 

我認爲上述效率會更高。

0

containsAll檢查兩個/四是你的列表的子集。它不關心訂單。

containsAll實現爲在Java中如下:

public boolean containsAll(Collection<?> c) { 

// get iterator for collection c 
Iterator<?> e = c.iterator(); 
// loop all elements in collection c 
while (e.hasNext()) 
// if collection A doesn’ have such an element 
if(!contains(e.next())) 
return false; 
return true; 

} 

正如你可以看到它只是告訴第二個集合是否是第一,不論順序的一個子集。 因此,如果你的列表有一個序列說2,1,2,4然後containsAll會給2的列表真實。

解決方案:您可以實現您自己的containsAll版本的contains containsOrderedAll版本,並將上述實現作爲參考進行調用。

1

如果它只是短碼,那麼這將做到這一點:

public boolean either24(int[] nums) { 
    String s = Arrays.toString(nums); 
    boolean twos = s.contains("2, 2"); 
    boolean fours = s.contains("4, 4"); 
    return (twos || fours) && !(twos && fours); 
}