java - 将有序 int 数组转换为有序数组列表时出现问题

标签 java

我的教授给了我们这段代码,它创建一个排序的 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/

相关文章:

java - 使用 morphia 执行 $elemMatch 查询时如何进行数值比较

java - 为什么我在执行 doInBackground() 时出现错误

java - ArrayIndexOutOfBoundsException - 数组本身没有初始化为默认值吗? ( java )

java - 使用 javax.servlet.RequestDispatcher.include() 时如何将参数传递给 .jsp 文件?

java - 从 IntelliJ 到 Heroku 的 war 部署

java - Map 的映射 - java 中的单词对 - 卡住

java - 在作为代理工作的 Nginx Ring 处理程序中读取服务器名称

java - 为什么 Set 被编译器标记为 "not a known variable in this context"?

Java - 制作字节数组作为下载

java - ProcessBuilder 不输出任何内容