我必须在数据集上应用一个算法。数据集由两种类型的对象组成,每种对象都有一个特定的ID。
在这里你可以找到我的第一种对象:
public static List<ObjectType1> getObjectType1() {
List<ObjectType1> myList = new ArrayList<ObjectType1>();
//Creating one ObjectType1 with ID : 1L
ObjectType1 obj1 = new ObjectType1();
obj1.setId(1L);
//Creating one ObjectType1 with ID : 2L
ObjectType1 obj2 = new ObjectType1();
obj2.setId(2L);
//Creating one ObjectType1 with ID : 3L
ObjectType1 obj3 = new ObjectType1();
obj3.setId(3L);
myList.add(obj1);
myList.add(obj2);
myList.add(obj3);
return myList;
}
这是第二种类型的对象:
public static List<ObjectType2> getObjectType2(){
List<ObjectType2> myList = new ArrayList<ObjectType2>();
//Creating one ObjectType2 with ID : 1L
ObjectType2 obj1 = new ObjectType2();
obj1.setId(1L)
//Creating one ObjectType2 with ID : 2L
ObjectType2 obj2 = new ObjectType2();
obj2.setId(2L)
//Creating one ObjectType2 with ID : 4L
ObjectType2 obj3 = new ObjectType2();
obj3.setId(4L)
myList.add(obj1);
myList.add(obj2);
myList.add(obj3);
return myList;
}
我需要做的是在上面应用一个简单的算法,但我的主要问题是,一旦尝试这样做,我就会出现一个空指针异常
让我解释一下:我想对所有ObjectType1进行排序。与ObjectType2具有相同ID的Thos,我保留它们。这意味着,如果其中一个ObjectType2->Ikeep中存在ObjectType1 ID(第一个为Long:1L)。如果ObjecType1 ID不存在,则它是ObjectType2-->之一,我们不会保留它。如何进行简单的"排序"?
到目前为止,我想做的是:
while (valueIterator.hasNext()) {
value = valueIterator.next();
if (value instanceof ObjectType1) {
objType1 = ObjectType1.newBuilder((ObjectType1) value).build();
} else if (value instanceof ObjectType2){
objType2 = ObjectType2.newBuilder((ObjectType2) value).build();
}
}
for(ObjectType1 obj : objs){
if (objType1.getId().equals(objType2.getId())) {
keep(objType1);
} else if (objType1.getId() != objType2.getId()) {
dontKeep(objType1);
}
}
此处出现我的空指针异常if (objType1.getId().equals(objType2.getId()))
,因为当我尝试获取objType2的ID"3L"时,它不存在。。。
在没有数据集的情况下,如何正确排序?我找不到正确循环的方法。
谢谢你的帮助。
有一个很好的技巧可以避免空指针异常。给你-
public List<SomeObject> someMethodReturnsSomeObjects(){
List<SomeObject> lists = new ArrayList<SomeObject>();
return (null!=lists ? lists : Collections.EMPTY_LIST);
}
在这里,您还需要针对null
进行测试。但这个代码片段的好处是,您只需要在一个地方检查null
,例如在返回objectType1
时在ObjectType1.newBuilder((ObjectType1) value).build()
方法中。但在那之后,你就不需要检查null了,因为你确信你的方法永远不会返回null。现在,您不需要使用null
来检查ObjectType1.newBuilder((ObjectType1) value).build()
的客户端代码。
此外,您可以对大多数数据类型执行此操作,例如-
对于字符串:return (null != str ? str : "");
对于映射:return (null != map ? map : Collections.EMPTY_MAP);
对于集合:return (null != map ? map : Collections.EMPTY_SET);
或者对于其他用户定义的数据类型,您可以创建自己的伪数据,如EMPTY_MAP或EMPTY_LIST。
希望它能有所帮助
非常感谢。