2 回答
TA贡献1828条经验 获得超3个赞
可悲的是,不可原谅的是,你的“教授”提供的代码在add()
方法中存在一个错误,如下:
public boolean add(int pos, Object newElement){ growBufferIfNecessary(); currentSize++; checkBounds(pos); // rest of method
因为checkBounds()
不是首先调用,所以如果pos
超出范围,currentSize
将增加(并且缓冲区不必要地增长),使实例处于不一致/错误状态。
编码101:首先检查参数。
修理:
public boolean add(int pos, Object newElement){ checkBounds(pos); growBufferIfNecessary(); currentSize++; // rest of method
要回答您的问题,您必须实现所谓的插入排序。简而言之,这意味着使用循环迭代所有元素,并在遇到更大元素或到达元素末尾时插入新元素。
请注意,如果您的数组元素尚未排序,则调用insert()
毫无意义。要处理这种情况,您应该考虑抛出IllegalStateException
if 元素无序(您可以在迭代时检查前一个元素是否不大于当前元素)。
TA贡献1831条经验 获得超10个赞
不完全像插入排序,因为有空值的空闲空间
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()函数可以替换第 1 行和第 2 行
TA贡献1875条经验 获得超5个赞
感谢大家的帮助和建议。我通过使用 Marco13 建议的代码让它工作: https: //codereview.stackexchange.com/questions/36221/binary-search-for-inserting-in-array#answer-36239 希望每个人都有美好的一天并快乐编程。-TJ
添加回答
举报