我的教授给了我们这个代码,它创建了一个有序的int数组,并希望我们将它转换为带有字符串的有序数组列表。这是维护任务,必须反映原始代码。所以,我不能使用size方法,Collections.sort()或任何不能反映原始代码的东西。
我们得到了
OrderedIntList() {
a = new int[10];
}
public void insert(int v) {
if(c == 0) {
a[0]= v;
c++;
} else {
int j = 0;
for (int i = 0; i < c; i++, j++) {
if(v < a[i])
break;
}
for (int i = c; i > j; i--) {
a[i] = a[i - 1];
}
a[j]= v;
c++;
}
}
这就是我想把它转换为数组列表
stringList() {
list = new ArrayList<String>(10);
}
public void insert(String element) {
if(c == 0) {
list.add(0, element);
c++;
} else {
int j = 0;
for (int i = 0; i < c; i++, j++) {
if(element.compareTo(list.get(i)) == -1)
break;
}
for (int i = c; i > j; i--) {
list.set(i, list.get(0));
}
list.set(j, element);
c++;
}
}
它一直在
上抛出异常list.set(i, list.get(0));
调试时我发现ArrayList.class抛出了异常,因为索引等于大小。我似乎无法想出一个解决方案。任何帮助将不胜感激。
答案 0 :(得分:3)
此分配的一个有趣方面是数组和列表在行为上有显着差异:数组具有固定大小,而列表在添加项目时展开。对于列表,将项目添加到除结尾之外的任何位置是插入,它会自动将项目移动到右侧以腾出空间。数组不会发生这种情况,因此需要在您重构的代码中手动完成。
因此,在我看来,对列表进行正确的最小重构是将set
转换为insert
,然后删除过去需要转换元素的代码。列表不再需要它:
public void insert(String element) {
if (c == 0) {
list.add(element);
c++;
} else {
int j = 0;
for (int i = 0; i < c; i++, j++) {
if (element.compareTo(list.get(i)) < 0 )
break;
}
list.insert(j, element);
c++;
}
}
对于列表,添加到空列表与插入位置0相同。因此,对于空列表的特殊处理是完全没有必要的。但这可能不会反映原作&#39;代码。
另一个更微妙的区别是,如果插入的项目超过10个,则此代码不会导致错误。要正确反映初始代码的行为,您需要专门为此添加测试。
if (c == MAX_SIZE)
throw new ArrayIndexOutOfBoundsException(c);
你的任务很可能不会指望你处理这个条件,但值得知道,如果不包括函数,重构正在改变函数的行为。
答案 1 :(得分:1)
解决问题的方法之一是
stringList() {
list = new ArrayList<String>(10);
}
DO
stringList() {
list = new ArrayList<String>(10);
for(int i = 0; i < 10; i++){
list.add("");
}
}
因为只有这将实现10个字符串的列表,第一个只是创建一个能够容纳10个字符串的列表(这更像是一个性能提示)