我编写了一个具有add和get方法的SortedIntList类。
我称之为以下四种方法:
SortedIntList mySortedIntList = new SortedIntList();
mySortedIntList.add(9);
mySortedIntList.add(7);
System.out.println("0 is :"+mySortedIntList.get(0));
System.out.println("1 is :"+mySortedIntList.get(1));
我的get和add方法如下所示:
public void add(Integer newValue) {
int position = 0;
while(position < list.size()){
int currentPosValue = list.get(position);
if(newValue <= currentPosValue){
for(int i=list.size()-1; i>=position; i--){
int toBeShifted = list.get(i);
list.set(i+1, toBeShifted);
}
list.set(position, newValue);
return;
}
position++;
}
list.add(newValue);
}
public int get(int i) throws IndexOutOfBoundsException {
// Postcondition: If i < 0 or i >= size() throws
// IndexOutOfBoundsException, otherwise returns the value
// at position i of this IntList
if (i < 0 || i >= list.size()) {
throw new IndexOutOfBoundsException("SortedIntList.get");
} else {
return ((Integer) list.get(i)).intValue();
}
}
public int get(int i) throws IndexOutOfBoundsException {
// Postcondition: If i < 0 or i >= size() throws
// IndexOutOfBoundsException, otherwise returns the value
// at position i of this IntList
if (i < 0 || i >= list.size()) {
throw new IndexOutOfBoundsException("SortedIntList.get");
} else {
return ((Integer) list.get(i)).intValue();
}
}
我已经把它写在纸上了,这似乎是合乎逻辑的,但代码却爆发了:
System.out.println("1 is :"+mySortedIntList.get(1))
行,显然1是不合时宜的,但我不知道如何。
答案 0 :(得分:1)
阅读Java Doc有帮助。显然使用set()要求在您尝试覆盖的位置已经存在一个值。我需要使用add(position,value)代替: - )
答案 1 :(得分:0)
使用Collections.sort()可能更容易,这个标准的Java方法会为你排序你的Collection。这样你就不用自己处理排序了,祝你好运!
答案 2 :(得分:0)
我看到了一些问题。
首先,list.set(i+i, toBeShifted);
应该是list.set(i+1, toBeShifted);
。当您向列表中添加7时,列表大小为1.在for循环中,将i初始化为0(列表大小 - 1)。当你调用list.set(i + i,toBeShifted)时,你正在调用list.set(0,toBeShifted),所以实际上没有移动值。
其次,虽然你没有加入9然后再加上7来遇到它,你将会在无限循环中结束。你永远不会改变位置的价值。如果你添加一个9然后再添加一个更大的数字,你就会被淹没。
答案 3 :(得分:0)
您无法使用列表的set()
添加到列表中:例如,如果您尝试将索引1处的内容设置为大小为1的列表中的内容,则会获得{{1} }。
基本上,您需要先IndexOutOfBoundsException
。