【问题标题】:How to convert an Array method to an ArrayList method?如何将 Array 方法转换为 ArrayList 方法?
【发布时间】:2016-07-20 15:57:58
【问题描述】:

如何更改以下方法以使用 ArrayList? 我在想这样的事情:

public static boolean sortArrayList(ArrayList<Integer> list) {
    return false;
}

但我不确定如何完成它。

这是我试图从使用 Array 转换为使用 ArrayList 的方法:

public static boolean sortArrayList(final int[] data) {
    for(int i = 1; i < data.length; i++) {
        if(data[i-1] > data[i]) {
            return false;
        }
    }
    return true;
}

【问题讨论】:

  • 由于您的 sortArrayList 方法不对 ArrayList 进行排序,您可能需要将其重命名为 isASortedArrayList
  • 你的方法名!这简直不能再误导了。

标签: java arrays arraylist methods type-conversion


【解决方案1】:
public static boolean sortArrayList(final ArrayList <Integer> data) {
    for (int i = 1; i < data.size(); i++) {
        if (data.get(i - 1) > data.get(i)) {
            return false;
        }
    }
    return true;
}

【讨论】:

    【解决方案2】:

    @Sanj 给出的已接受答案有一些问题:(A) 它不处理列表中的空值,(B) 它不必要地专门用于 ArrayList&lt;Integer&gt;,而它很容易只是 @ 987654322@,以及 (C) 方法名称具有误导性。

    注意:对于 (A),获得 NPE 很可能是合适的 - OP 没有说。对于演示代码,我假设空值是可忽略的。其他解释也很公平,例如null 始终是“最小”值(需要不同的编码,LAAEFTR)。无论如何,行为应该是 JavaDoc 的——我在我的演示中没有这样做 #8>P

    注意:对于 (B),保留专用版本可能会提高运行时性能,因为该方法“知道”支持数据在数组中,并且编译器可能在使用 Iterable 的版本上提取一些运行时效率,但这样的说法对我来说似乎是可疑的,无论如何,我希望看到基准结果来支持这样的. ALSO 甚至我演示的版本也可以使用通用元素类型进一步抽象(而不是仅限于Integer)。这样的方法可能有如下定义:

    public static <T extends Comparable<T>> boolean isAscendingOrder(final Iterable<T> sequence)
    

    注意:对于 (C),我遵循 @Valentine 的方法命名建议(几乎)。我非常喜欢这个想法,我更进一步明确地指出了检查排序的方向性。

    下面是一个演示类,它显示了 isAscendingOrder 的良好行为,它解决了所有这些问题,然后是 @Sanj 的解决方案的类似行为(直到 NPE)。当我运行它时,我得到控制台输出:

    true, true, true, true, false, true
    ------------------------------------
    true, true, true, true, false, 
    Exception in thread "main" java.lang.NullPointerException
        at SortCheck.sortArrayList(SortCheck.java:35)
        at SortCheck.main(SortCheck.java:78)
    

    .

    import java.util.ArrayList;
    
    public class SortCheck
    {
        public static boolean isAscendingOrder(final Iterable<Integer> sequence)
        {
            Integer prev = null;
            for (final Integer scan : sequence)
            {
                if (prev == null)
                {
                    prev = scan;
                }
                else
                {
                    if (scan != null)
                    {
                        if (prev.compareTo(scan) > 0)
                        {
                            return false;
                        }
    
                        prev = scan;
                    }
                }
            }
    
            return true;
        }
    
        public static boolean sortArrayList(final ArrayList<Integer> data)
        {
            for (int i = 1; i < data.size(); i++)
            {
                if (data.get(i - 1) > data.get(i))
                {
                    return false;
                }
            }
            return true;
        }
    
        private static ArrayList<Integer> createArrayList(final Integer... vals)
        {
            final ArrayList<Integer> rval = new ArrayList<>();
    
            for(final Integer x : vals)
            {
                rval.add(x);
            }
    
            return rval;
        }
    
        public static void main(final String[] args)
        {
            final ArrayList<Integer> listEmpty     = createArrayList();
            final ArrayList<Integer> listSingleton = createArrayList(2);
            final ArrayList<Integer> listAscending = createArrayList(2, 5, 8, 10  );
            final ArrayList<Integer> listPlatuea   = createArrayList(2, 5, 5, 10  );
            final ArrayList<Integer> listMixedUp   = createArrayList(2, 5, 3, 10  );
            final ArrayList<Integer> listWithNull  = createArrayList(2, 5, 8, null);
    
            System.out.print(isAscendingOrder(listEmpty    ) + ", ");
            System.out.print(isAscendingOrder(listSingleton) + ", ");
            System.out.print(isAscendingOrder(listAscending) + ", ");
            System.out.print(isAscendingOrder(listPlatuea  ) + ", ");
            System.out.print(isAscendingOrder(listMixedUp  ) + ", ");
            System.out.print(isAscendingOrder(listWithNull ) + "\n");
    
            System.out.println("------------------------------------");
    
            System.out.print(sortArrayList(listEmpty    ) + ", ");
            System.out.print(sortArrayList(listSingleton) + ", ");
            System.out.print(sortArrayList(listAscending) + ", ");
            System.out.print(sortArrayList(listPlatuea  ) + ", ");
            System.out.print(sortArrayList(listMixedUp  ) + ", ");
            System.out.print(sortArrayList(listWithNull ) + "\n");
        }
    }
    

    【讨论】:

      【解决方案3】:

      试试下面的函数,它将integer array转换成ArrayList然后计算结果:

      public static boolean sortArrayList(final int[] data) {
              List<Integer> aList = new ArrayList<Integer>();
              for (int index = 0; index < data.length; index++)
                  aList.add(data[index]);
      
              for (int i = 1; i < aList.size(); i++) {
                  if (aList.get(i - 1) > aList.get(i)) {
                      return false;
                  }
              }
              return true;
          }
      

      【讨论】:

        猜你喜欢
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-17
        • 2019-04-10
        • 2017-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多