2011-02-23 103 views
0

我有一個對象和比較器的列表,用於在列表中進行排序和序列化。 Collections.binarySearch()返回null,它應該返回一個整數值。以下是代碼:Java 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之後,用作鍵的對象溫度也爲空。我沒有任何預期。我嘗試了一個字段的其他類相同的代碼,它工作正常。 任何幫助將不勝感激。

+3

哪有'binarySearch'回空當它不返回具有空值的類型?你怎麼知道'index'是空的而不是0? – 2011-02-23 07:46:39

+0

此代碼在刪除'temp.setId((long)55)的機器上工作。 ' – 2011-02-23 07:49:42

+0

-1 - 這個問題是報告公然不可能的事情。 – 2011-02-23 07:59:32

回答

5

返回類型Collections.binarySearch()int所以此方法不能返回null。它可能返回0,但是這將是該對象在索引0(即,第一元件)中發現的指示。

此外,還有沒有辦法,tempnull您的來電Collections.binarySearch()後,因爲該方法不能修改的temp值(如Java不傳址引用)。

當我嘗試你的代碼index-6binarySearch返回,說明temp不在集合中(這是意料之中的,因爲沒有AttribRow對象與indv1價值25在那裏),並將在6位置插入,以排序。

0

注意:帶有Indv1 25的AttribRow未添加到列表中,您的代碼在temp.setIndv1((long) 25);之後缺少rows.add(temp);

此外,我認爲重新分配對象temp = new AttribRow()是容易出錯的做法。

0

I'm越來越-6與您的代碼太...爲什麼你用這麼多的22 Indv1?根據這一點,您將懷疑哪個對象是正確的:

使用二進制搜索算法搜索指定對象的指定對象。該列表必須按照指定比較器的升序排序(如上面的Sort(List,Comparator)方法),然後再進行此調用。如果沒有排序,結果是不確定的。 如果列表包含與指定對象相同的多個元素,則不能保證會找到哪個元素。