当前位置: 首页 > 知识库问答 >
问题:

提取和删除不完全与ArrayList一起工作的模式

章阳波
2023-03-14

我正在为AP Computer Science做一项作业,其中包括生成一个listarray(在一定范围内),然后用html" target="_blank">方法处理它们,去除超过或小于程序前面确定的阈值的对象。这里是我编写的代码的一个例子,同时还有我的老师提供的前提条件。

/**
* @param orig is a List of Integer
* @param mid is an int > 2
* @return a new List of Integer that contains, in order, all the numbers in
* orig that are >= mid / 2
*/public static ArrayList<Integer> extractUpper(ArrayList<Integer> orig, int mid) {
    ArrayList<Integer> myArray = new ArrayList<Integer>();
    for(Integer a: orig) {
        if (a >= mid/2)
            myArray.add(a);
    }
    return myArray;
}

/**
* @param orig is a List of Integer
* @param mid is an int > 2
* @return none PostCondition: all numbers less than  mid / 2 have been 
*  removed from orig
*/
public static void deleteUpper(ArrayList<Integer> orig, int mid) {
    for(int j = 0; j < orig.size(); j++) {
        if (orig.get(j) >= (mid/2))
            orig.remove(j);
    }

}

对我来说,这看起来应该工作得很好,但是当我运行这个:

ic static void main(String[] args) {
    //a.
    int listLen = 10;
    int listMax = 20;
    System.out.println("listLen equals " + listLen + " and listMax equals " + listMax);
    System.out.println();

    //b.
    System.out.println("Generating a fixed-length ArrayList of length " + listLen + " with all values >= 0 and < " + listMax);
    ArrayList<Integer> Array1 = Main.buildFixedList(listLen, listMax);
    System.out.println(Array1);

    //c.        
    System.out.print("The numbers in this ArrayList >= " + listMax/2 + " are: ");
    ArrayList<Integer> Array2 = Main.extractUpper(Array1, listMax);
    System.out.println(Array2);

    //d.
    System.out.print("After deleting numbers > " + listMax/2 + " the modified list is: ");
    Main.deleteUpper(Array1, listMax);
    System.out.println(Array1);

    //e.
    System.out.print("After deletion, the numbers in the List >= " + listMax/2 + " are: ");
    ArrayList<Integer> Array3 = Main.extractUpper(Array1, listMax);
    System.out.println(Array3);

    //f.
    System.out.println();

我的输出似乎忽略了某些数字,有些比其他的更频繁。

listLen equals 10 and listMax equals 20

Generating a fixed-length ArrayList of length 10 with all values >= 0 and < 20
[14, 16, 12, 9, 8, 11, 14, 16, 1]
The numbers in this ArrayList >= 10 are: [14, 16, 12, 11, 14, 16]
After deleting numbers > 10 the modified list is: [16, 9, 8, 14, 1]
After deletion, the numbers in the List >= 10 are: [16, 14]

>=10和<10方法偶尔也会起作用,但我认为现在它更像是一个废话。在这个特定的示例中,>=10方法起作用,但<10则无效。我不知道我的代码出了什么问题。

编辑:谢谢你所有的回复,我很感谢你的帮助。我已经编辑了extractUpper和deleteUpper方法,并且获得了更高的成功率,但是代码似乎忽略了一些数字。代码如下:

 /**
* @param orig is a List of Integer
* @param mid is an int > 2
* @return a new List of Integer that contains, in order, all the numbers in
* orig that are >= mid / 2
*/public static ArrayList<Integer> extractUpper(ArrayList<Integer> orig, int mid) {
    ArrayList<Integer> myArray = new ArrayList<Integer>();
    for (int i = 0;  i < orig.size(); i++){
        if(orig.get(i) >= mid/2) {
            myArray.add(orig.get(i));
        }
    }
    return myArray;
}

/**
* @param orig is a List of Integer
* @param mid is an int > 2
* @return none PostCondition: all numbers less than  mid / 2 have been 
*  removed from orig
*/
public static void deleteUpper(ArrayList<Integer> orig, int mid) {
    for ( int i = orig.size()-1;  i >= 0; i--){
        if (i < orig.size()) {
            if(orig.get(i) >= mid/2) {
                orig.remove(i);
                i++;
            }
        }
        else
            i--;
    }

}

下面是直接来自程序的几个输出:

listLen equals 10 and listMax equals 20

Generating a fixed-length ArrayList of length 10 with all values >= 0 and < 20
[4, 15, 8, 11, 18, 16, 7, 3, 6]
The numbers in this ArrayList >= 10 are: [15, 11, 18, 16]
After deleting numbers > 10 the modified list is: [4, 8, 7, 3, 6]
After deletion, the numbers in the List >= 10 are: []

Generating a fixed-length ArrayList of length 10 with all values >= 0 and < 20
[6, 3, 9, 16, 4, 4, 17, 8, 4]
The numbers in this ArrayList >= 10 are: []
After deleting numbers > 10 the modified list is: [6, 3, 9, 4, 4, 8, 4]
After deletion, the numbers in the List >= 10 are: []

listLen equals 10 and listMax equals 20

Generating a fixed-length ArrayList of length 10 with all values >= 0 and < 20
[4, 5, 0, 4, 12, 12, 1, 12, 10]
The numbers in this ArrayList >= 10 are: [12, 12, 12, 10]
After deleting numbers > 10 the modified list is: [4, 5, 0, 4, 1, 12]
After deletion, the numbers in the List >= 10 are: [12]

Generating a fixed-length ArrayList of length 10 with all values >= 0 and < 20
[15, 16, 2, 8, 1, 7, 3, 0, 15]
The numbers in this ArrayList >= 10 are: [12]
After deleting numbers > 10 the modified list is: [2, 8, 1, 7, 3, 0]
After deletion, the numbers in the List >= 10 are: [12]

共有1个答案

郤浩慨
2023-03-14

问题出在deleteuper方法中。

当您从列表中删除一个项目时,该列表中的索引会发生变化--如果您删除项目3,那么以前在索引4处可访问的项目现在变成了编号3。

在您的实现中,您总是增加索引指针,不管删除是否发生。这意味着,如果连续两个项目符合删除标准,则只删除第一个项目。

Iterator<Integer> i = orig.iterator();
while (i.hasNext()) {
    if (i.next() >= mid) {
        i.remove();
    }
}
for (int i=0;  i<orig.size(); ) {
    if (orig.get(i) >= mid) {
        orig.remove(i);
    }
    else {
        i++;
    }
}
 类似资料:
  • 我试图实现菲尔·斯特金的Rest服务器,并学习如何使用api密钥进行身份验证。程序在获取和删除请求时运行良好,但在尝试发布和其他剩余方法时,它会抛出“未授权”响应。当我尝试使用摘要身份验证时(这里我使用chrome高级rest客户端进行测试),用户名和密码不匹配,浏览器总是显示登录表单 我使用默认的示例类包括在Rest服务器捆绑包

  • 因此,对于我的完成暗示前缀:“ela”,我希望输出为“Hello elastic Search”。 我知道一个简单的解决方案是添加多字段输入,如下所示: 但是,如果这是解决方案,那么使用分析器有什么意义呢?分析器在完成暗示中有意义吗? 我的映射: 我的文档: 搜索请求: 提前谢了。 吉米

  • 我制作了一个简单的程序,使用JavaFX和JDBC作为依赖项,我使用jpackage将其打包到一个可安装的文件中,没有任何困难,但当我尝试启动我的程序时,会出现以下错误: 附:该程序在IDE中运行良好,还带有CMD(运行“.jar”文件而不是安装的文件),这只是结果。给出该错误的exe文件。我试着编写相同的程序,但没有调用或使用mysql数据库,而且效果很好,所以我假设问题与依赖关系(即mysql

  • 正如标题所示,我无法使用delete()选项。我在网上发了很多帖子,但都找不到正确的答案。我正在Homestead上使用Laravel5.5(一周前安装,最新版本左右)。 让我给你一些代码,我真的希望有人能帮助我。 这让我头痛,奥氮平快用完了。请告诉我我做错了什么,如果遗漏了什么,请告诉我! 这是我的控制器: 这是我的索引页(索引与后端的管理索引相同: 然后是路线: 然后政策: 最后是中间件: 在

  • 到目前为止,我已经尝试了以下命令: 但每当我尝试使用以下命令查找MySQL时,我都会得到一个与MySQL相关的文件列表: 输出: 我现在该怎么办? 我试图找出是否有任何方法可以删除所有与MySQL相关的文件,然后重新安装MySQL。 我需要它来连接Qt。

  • 我注意到我的机器人没有设置RichPresence,就像我今天看它一样。我最后一次检查它是在星期三,代码也在那里工作。所以我今天再次执行它,并且RichPresence没有像往常一样重新设置。现在我认为不和谐会改变它的界面。 现在,我在我的项目中使用了最新的JDA版本,并对代码进行了修改,使数据对象成为JSONObject,但它仍然无法工作。作为第二个,我试图使我的“Spielst”对象成为Ric