2 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
可悲的是,不可原諒的是,你的“教授”提供的代碼在add()
方法中存在一個(gè)錯(cuò)誤,如下:
public?boolean?add(int?pos,?Object?newElement){ ????growBufferIfNecessary(); ????currentSize++; ????checkBounds(pos);? ???????//?rest?of?method
因?yàn)?code>checkBounds()不是首先調(diào)用,所以如果pos
超出范圍,currentSize
將增加(并且緩沖區(qū)不必要地增長),使實(shí)例處于不一致/錯(cuò)誤狀態(tài)。
編碼101:首先檢查參數(shù)。
修理:
public?boolean?add(int?pos,?Object?newElement){ ????checkBounds(pos); ????growBufferIfNecessary(); ????currentSize++; ????????//?rest?of?method
要回答您的問題,您必須實(shí)現(xiàn)所謂的插入排序。簡而言之,這意味著使用循環(huán)迭代所有元素,并在遇到更大元素或到達(dá)元素末尾時(shí)插入新元素。
請注意,如果您的數(shù)組元素尚未排序,則調(diào)用insert()
毫無意義。要處理這種情況,您應(yīng)該考慮拋出IllegalStateException
if 元素?zé)o序(您可以在迭代時(shí)檢查前一個(gè)元素是否不大于當(dāng)前元素)。

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
不完全像插入排序,因?yàn)橛锌罩档目臻e空間
public void insert( int n ) {
growBufferIfNecessary();
for( int i = 0; i < buffer.length; i++ ) {
if( buffer[i] == null ) {
buffer[i] = n; currentSize++;
break;
}
else if( buffer[i + 1] != null ) {
int n1 = ((Number)buffer[i]).intValue();
int n2 = ((Number)buffer[i + 1]).intValue();
if( n1 < n && n2 > n ) {
System.arraycopy( buffer, i + 1, buffer, i + 2, currentSize - i - 1 ); // line 1
buffer[i + 1] = n; currentSize++; // line 2
break;
}
}
}
}
該add()函數(shù)可以替換第 1 行和第 2 行

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
感謝大家的幫助和建議。我通過使用 Marco13 建議的代碼讓它工作: https: //codereview.stackexchange.com/questions/36221/binary-search-for-inserting-in-array#answer-36239 希望每個(gè)人都有美好的一天并快樂編程。-TJ
添加回答
舉報(bào)