繁体   English   中英

如何将Array方法转换为ArrayList方法?

[英]How to convert an Array method to an ArrayList method?

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

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

但是我不确定如何完成它。

这是我尝试从使用数组转换为使用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;
}
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;
}

我对@Sanj给出的答案有一些疑问:(A)它不处理列表中的空值,(B)当它很容易只是Iterable<Integer>时,它不必要地专门用于ArrayList<Integer> Iterable<Integer> ,并且(C)方法名称具有误导性。

注意:对于(A),获得NPE很可能是合适的-OP并未说明。 对于演示代码,我假设null是可忽略的。 其他解释也很公平,例如null始终是“最小”值(要求使用不同的编码LAAEFTR )。 无论如何,该行为应为JavaDoc'ed-我在演示#8> P中未执行此操作

注意:对于(B),保留专用版本可能会提高运行时性能,因为该方法“知道”支持数据在数组中,并且编译器可能会使用Iterable提取该版本上的某些运行时效率,但这种说法似乎令人怀疑。我,无论如何,我希望看到基准测试结果来支持这一点。 甚至我试玩的版本可以使用通用元素类型(VS限于被进一步抽象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");
    }
}

尝试下面的函数,它接受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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM