我有一个公认的答案的一些问题,通过@给出Sanj:(A)它不处理列表中的空值,(B)它不必要地专用于ArrayList<Integer>
,因为它很容易仅仅是Iterable<Integer>
,(C)方法名称具有误导性。
注意:对于(A),获得NPE很可能是合适的--OP没有说。对于演示代码,我认为空值是可以忽略的。其他解释也是公平的,例如, null始终是“最小”值(需要不同的编码,LAAEFTR)。无论如何,该行为应JavaDoc'ed - 这是我没有在我的演示#8>点
注意做到:对于(B),保持专业版威力提高运行时性能,因为该方法“知道”支持数据在一个数组中,编译器可能会使用Iterable
提取一些运行时效率,但这种说法似乎对我来说可疑,无论如何,我希望看到基准测试结果为支持这样的。 还可以即使我的演示版本可以进一步抽象使用通用元素类型(vs限于Integer
)。这种方法可能有定义,如:
public static <T extends Comparable<T>> boolean isAscendingOrder(final Iterable<T> sequence)
注:(C),我关注@情人节的方法命名建议(几乎)。我非常喜欢这个想法,我进一步明确地提出了检查排序的方向性。
下面是一个演示类,该演示类显示了解决所有这些问题的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");
}
}
由于您sortArrayList方法ArrayList的不排序,您可能希望将其重命名为像isASortedArrayList – Valentin
您的方法名称!这实际上不会再有误导。 –