将有序int数组转换为有序数组列表的麻烦

时间:2016-09-10 01:28:58

标签: java maintenance

我的教授给了我们这个代码,它创建了一个有序的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抛出了异常,因为索引等于大小。我似乎无法想出一个解决方案。任何帮助将不胜感激。

2 个答案:

答案 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个字符串的列表(这更像是一个性能提示)