【问题标题】:How to use Arrays.asList() to do List functions on arrays如何使用 Arrays.asList() 对数组执行 List 函数
【发布时间】:2013-04-11 03:12:48
【问题描述】:

提示:给定一个整数数组,如果该数组在 2 旁边包含 2 或在 4 旁边包含 4,但不能同时包含两者,则返回 true。

我只使用 Arrays 而没有 List 方法来完成此操作,但我想以这种方式进行练习。这就是我所拥有的,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 而不是 Integer。新代码:

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);
}

【问题讨论】:

    标签: java arrays list


    【解决方案1】:

    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");
                }
            }
    

    上面那个sn-p没有给你答案。您仍然需要处理问题的 but not both 部分,这将由您来完成。

    【讨论】:

      【解决方案2】:

      问题在于您使用的是containsAll 方法。文档说:

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

      即使您两次传入 2,它也只是检查列表是否包含 2。换句话说,它是在说,“这个列表有两个吗?好。这个列表有两个吗?好”

      【讨论】:

        【解决方案3】:

        试试这个:

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

        【讨论】:

          【解决方案4】:

          如果只是简短的代码,那么也可以这样做:

          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);
          }
          

          【讨论】:

            【解决方案5】:

            containsAll 检查 twos/fours 是否是您列表的子集。它不关心订单。

            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 的列表提供 true。

            解决方案:您可以实现自己的 containsAll 版本,例如 containsOrderedAll 并使用上述实现作为参考来调用它。

            【讨论】:

              【解决方案6】:
                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;
                }
              

              我认为上面的方法会更有效率。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-11-17
                • 2011-07-27
                • 2017-02-02
                • 2021-09-24
                • 2016-09-07
                • 2023-04-06
                相关资源
                最近更新 更多