Java 返回列表中的最后一项

Java 返回列表中的最后一项,java,arraylist,sub-array,Java,Arraylist,Sub Array,我将返回列表中的最后一项。一个或多个子列表可能为null或空。如果列表中没有项目,则返回null。注意,如果实际项目为null,则仍返回null。例如,在[[10,20],[40,null]]中。对于基本测试,您可以假设列表、任何子列表或子列表中的任何项都不为空 public static Integer getLastItem(ArrayList<ArrayList<Integer>> list) { if (list == null) { re

我将返回列表中的最后一项。一个或多个子列表可能为null或空。如果列表中没有项目,则返回null。注意,如果实际项目为null,则仍返回null。例如,在[[10,20],[40,null]]中。对于基本测试,您可以假设列表、任何子列表或子列表中的任何项都不为空

public static Integer getLastItem(ArrayList<ArrayList<Integer>> list) {
    if (list == null) {
        return null;
    }
    Integer last = null;
    for (ArrayList<Integer> data : list) {
        for (Integer o : data) {
            if (!o.equals(null)) {
                last = o;
            }
        }
    }
    return last;
}
public静态整数getLastItem(ArrayList列表){
if(list==null){
返回null;
}
整数last=null;
用于(ArrayList数据:列表){
for(整数o:数据){
如果(!o.equals(null)){
last=o;
}
}
}
最后返回;
}
我的代码未通过全面测试并停留在以下行的原因:assertEquals(null,ListOfListService.getLastItem(list4\u nullItems))。我已经做了很长一段时间了,还没弄明白。测试的其余部分是

@Test @Graded(description="GetLastItemComprehensive", marks=4)
public void testGetLastItemComprehensive() {
    testGetLastItemBasic();
    assertEquals(null, ListOfListService.getLastItem(null));
    assertEquals(null, ListOfListService.getLastItem(list4_nullItems));
    list4_nullItems.get(5).set(2, 24);
    assertEquals(Integer.valueOf(24), ListOfListService.getLastItem(list4_nullItems));

    ArrayList<ArrayList<Integer>> allEmptyOrNull = new ArrayList<ArrayList<Integer>>();
    allEmptyOrNull.add(null);
    allEmptyOrNull.add(new ArrayList<Integer>());
    allEmptyOrNull.add(null);
    allEmptyOrNull.add(new ArrayList<Integer>());
    assertEquals(null, ListOfListService.getLastItem(allEmptyOrNull));
    currentMethodName = new Throwable().getStackTrace()[0].getMethodName();
}
@Test@Graded(description=“GetLastItemComprehensive”,分数=4)
public void testGetLastItemComprehensive(){
testGetLastItemBasic();
assertEquals(null,ListOfListService.getLastItem(null));
assertEquals(null,ListOfListService.getLastItem(list4_nullItems));
list4_nullItems.get(5).set(2,24);
assertEquals(Integer.valueOf(24),ListOfListService.getLastItem(list4_nullItems));
ArrayList allEmptyOrNull=新的ArrayList();
allEmptyOrNull.add(null);
add(newarraylist());
allEmptyOrNull.add(null);
add(newarraylist());
assertEquals(null,ListOfListService.getLastItem(allEmptyOrNull));
currentMethodName=new Throwable().getStackTrace()[0].getMethodName();
}

一句话立刻吸引了我的注意:

如果(!o.equals(null)){
//...
}
o.equals(null)
永远不会返回true。如果
o
为null,则会抛出
NullPointerException
,因为您试图调用null对象上的方法

要解决此问题,只需将if语句中的表达式替换为以下行:

如果(o!=null){
//...
}
这将安全地将
o
与null进行比较,而不会引发
NullPointerException

编辑:正如@AlexShesterov所指出的,如果作为参数传递给
getLastItem
的列表包含null元素,这仍然会导致
NullPointerException
。解决此问题的最简单方法是在迭代其元素之前检查
数据是否为null:

for(ArrayList数据:列表){
如果(数据!=null){
for(整数o:数据){
// ...
}
}
}
一个可能被认为更干净的解决方案是:

public static Integer getLastItem(ArrayList<ArrayList<Integer>> list) {
    if (list == null) {
        return null;
    }
    // loop over each data ArrayList in reversed order
    for (int i = list.size() - 1; i >= 0; i--) {
        final ArrayList<Integer> data = list.get(i);
        // skip null elements
        if (data == null) {
            continue;
        }
        // loop over each Integer in data in reversed order
        for (int j = data.size() - 1; j >= 0; j--) {
            final Integer o = data.get(j);
            // the first Integer that was found will be the the last non-null
            // entry of the last non-null data list
            if (o != null) {
                return o;
            }
        }
    }

    // if this place is reached, no element was found, so null should be returned
    return null;
}
public静态整数getLastItem(ArrayList列表){
if(list==null){
返回null;
}
//按相反顺序在每个数据数组列表上循环
对于(int i=list.size()-1;i>=0;i--){
最终ArrayList数据=list.get(i);
//跳过空元素
如果(数据==null){
继续;
}
//按相反顺序在数据中的每个整数上循环
对于(int j=data.size()-1;j>=0;j--){
最终整数o=data.get(j);
//找到的第一个整数将是最后一个非空整数
//最后一个非空数据列表的条目
如果(o!=null){
返回o;
}
}
}
//如果到达该位置,则未找到任何元素,因此应返回null
返回null;
}
这种方式有两个决定性的优点:

  • 您不必每次调用此方法时都循环整个列表,这提高了大型列表的性能
  • 您可以避免重新分配,因此代码将更易于调试

再次感谢@AlexShesterov激励我写最后一篇摘要。

有一句话立即吸引了我的眼球:

如果(!o.equals(null)){
//...
}
o.equals(null)
永远不会返回true。如果
o
为null,则会抛出
NullPointerException
,因为您试图调用null对象上的方法

要解决此问题,只需将if语句中的表达式替换为以下行:

如果(o!=null){
//...
}
这将安全地将
o
与null进行比较,而不会引发
NullPointerException

编辑:正如@AlexShesterov所指出的,如果作为参数传递给
getLastItem
的列表包含null元素,这仍然会导致
NullPointerException
。解决此问题的最简单方法是在迭代其元素之前检查
数据是否为null:

for(ArrayList数据:列表){
如果(数据!=null){
for(整数o:数据){
// ...
}
}
}
一个可能被认为更干净的解决方案是:

public static Integer getLastItem(ArrayList<ArrayList<Integer>> list) {
    if (list == null) {
        return null;
    }
    // loop over each data ArrayList in reversed order
    for (int i = list.size() - 1; i >= 0; i--) {
        final ArrayList<Integer> data = list.get(i);
        // skip null elements
        if (data == null) {
            continue;
        }
        // loop over each Integer in data in reversed order
        for (int j = data.size() - 1; j >= 0; j--) {
            final Integer o = data.get(j);
            // the first Integer that was found will be the the last non-null
            // entry of the last non-null data list
            if (o != null) {
                return o;
            }
        }
    }

    // if this place is reached, no element was found, so null should be returned
    return null;
}
public静态整数getLastItem(ArrayList列表){
if(list==null){
返回null;
}
//按相反顺序在每个数据数组列表上循环
对于(int i=list.size()-1;i>=0;i--){
最终ArrayList数据=list.get(i);
//跳过空元素
如果(数据==null){
继续;
}
//按相反顺序在数据中的每个整数上循环
对于(int j=data.size()-1;j>=0;j--){
最终整数o=data.get(j);
//找到的第一个整数将是最后一个非空整数
//最后一个非空数据列表的条目
如果(o!=null){
返回o;
}
}
}
//如果到达该位置,则未找到任何元素,因此应返回null
返回null;
}
这种方式有两个决定性的优点:

  • 是吗