我有一个对象列表和Comparator,用于在该列表中进行排序和搜索。 Collections.binarySearch()返回null,而它应该返回一个整数值。这是代码:
List<AttribRow> rows = new ArrayList<AttribRow> ();
AttribRow temp = new AttribRow();
temp.setIndv1((long)22);
rows.add(temp);
temp = new AttribRow();
temp.setIndv1((long)22);
rows.add(temp);
temp = new AttribRow();
temp.setIndv1((long)22);
rows.add(temp);
temp = new AttribRow();
temp.setIndv1((long)23);
rows.add(temp);
temp = new AttribRow();
temp.setIndv1((long)22);
rows.add(temp);
temp = new AttribRow();
temp.setIndv1((long)25);
temp.setId((long)55);
Collections.sort(rows, new CitRowsComparator());
int index = 0;
index = Collections.binarySearch(rows, temp,new CitRowsComparator());
AttribRow是映射到表的实体bean类。它有一个字段indv1,用于比较。
private Long indv1;
public Long getIndv1() {
return indv1;
}
public void setIndv1(Long indv1) {
this.indv1 = indv1;
}
这是Comporator类的代码
public class CitRowsComparator implements Comparator<AttribRow> {
public CitRowsComparator() {
super();
}
public int compare(AttribRow one, AttribRow two) {
return one.getIndv1().compareTo(two.getIndv1());
}
}
Collections.binarySearch()alsways返回null。即使我在Comparator中将compare()方法更改为返回0,它仍然返回null。在binarySearch envocation之后,用作键的对象临时值也为null。我没有任何开支。我尝试了一个字段的其他类的相同代码,它工作正常。 任何帮助将不胜感激。
答案 0 :(得分:5)
Collections.binarySearch()
的返回类型为int
,因此此方法无法返回null
。它可能会返回0
,但这表明该对象位于索引0
(即第一个元素)。
此外,在调用temp
后,null
无法Collections.binarySearch()
,因为该方法无法修改temp
的值(因为Java未通过)逐参考)。
我在index
返回后尝试您的代码-6
时binarySearch
,表示temp
不在集合中(预期为AttribRow
} indv1
值为25
的对象在那里),并将插入位置6
进行排序。
答案 1 :(得分:0)
注意:没有将带有Indv1 25的AttribRow添加到列表中,rows.add(temp);
之后您的代码遗失temp.setIndv1((long) 25);
。
此外,我认为重新分配对象temp = new AttribRow()
是容易出错的做法。
答案 2 :(得分:0)
我的代码也得到-6了......为什么你使用这么多22个Indv1?根据这一点,你将怀疑哪个对象是正确的:
使用二进制搜索算法在指定列表中搜索指定的对象。在进行此调用之前,必须根据指定的比较器(如上面的Sort(List,Comparator)方法)将列表按升序排序。如果未排序,则结果未定义。 如果列表包含多个与指定对象相等的元素,则无法保证找到哪个元素。