[英]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.