Java Collections.binarySearch()返回null

时间:2011-02-23 07:37:11

标签: java

我有一个对象列表和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。我没有任何开支。我尝试了一个字段的其他类的相同代码,它工作正常。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:5)

Collections.binarySearch()的返回类型为int,因此此方法无法返回null。它可能会返回0,但这表明该对象位于索引0(即第一个元素)。

此外,在调用temp后,null无法Collections.binarySearch(),因为该方法无法修改temp的值(因为Java未通过)逐参考)。

我在index返回后尝试您的代码-6binarySearch,表示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)方法)将列表按升序排序。如果未排序,则结果未定义。 如果列表包含多个与指定对象相等的元素,则无法保证找到哪个元素。