2013-04-18 40 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); 
}