我的教授给了我们这段代码,它创建一个排序的 int 数组,并希望我们将其转换为带有字符串的排序数组列表。这是一项维护任务,必须反射(reflect)原始代码。因此,我无法使用 size 方法、Collections.sort() 或任何不反射(reflect)原始代码的方法。
我们被给予
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 抛出异常,因为索引等于大小。我似乎想不出解决办法。任何帮助将不胜感激。
最佳答案
此作业的一个有趣的方面是数组和列表在行为上有显着差异:数组具有固定大小,而列表随着项目的添加而扩展。对于列表,在除末尾以外的任何位置添加项目都是插入,它会自动将项目移动到右侧以腾出空间。数组不会发生这种情况,因此需要在您正在重构的代码中手动完成。
因此,在我看来,从数组到列表的正确最小重构是将 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插入是一样的。所以完全没有必要对空列表进行特殊处理。但这可能并没有“反射(reflect)原始”代码。
另一个更微妙的区别是,如果插入超过 10 个项目,此代码不会导致错误。为了正确反射(reflect)初始代码的行为,您需要专门为此添加一个测试。
if (c == MAX_SIZE)
throw new ArrayIndexOutOfBoundsException(c);
您的任务可能并不期望您处理该情况,但值得知道的是,如果不包含该情况,重构就会改变函数的行为。
关于java - 将有序 int 数组转换为有序数组列表时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421639/