Java 在保持排序顺序的同时添加到ArrayList的问题

Java 在保持排序顺序的同时添加到ArrayList的问题,java,sorting,arraylist,Java,Sorting,Arraylist,所以我的家庭作业有问题。本质上,我们必须创建SorterDarrayList类,该类扩展java.util.ArrayList,并重写ArrayList的默认add方法,以便我们可以维护从最低到最高的整数排序列表 下面是我的教授给全班的代码,用来测试我们的方法: package Asg3; import java.util.ArrayList; import myUtil.SortedArrayList; public class Asg3 { public static v

所以我的家庭作业有问题。本质上,我们必须创建SorterDarrayList类,该类扩展java.util.ArrayList,并重写ArrayList的默认add方法,以便我们可以维护从最低到最高的整数排序列表

下面是我的教授给全班的代码,用来测试我们的方法:

package Asg3;

import java.util.ArrayList;

import myUtil.SortedArrayList;

public class Asg3 {



    public static void testInteger() {
        SortedArrayList<Integer> sorted= new SortedArrayList<Integer>();

        for (int i=0;i<20;i++) {
            sorted.add((int)(Math.random()*1000));
        }
        int bad=0;
        for (int i=0;i<20;i++) {
            try {
                sorted.add((int)(Math.random()*1000)%sorted.size(),(int)(Math.random()*1000));
            } catch (IllegalArgumentException e) {
                System.out.print(".");
                bad++;
            }
        }

        System.out.println("\nsize: "+sorted.size()+"  bad insertions: "+bad);
        System.out.println(sorted.toString());
    }



    }

    public static void main(String[] args) {

        testInteger();



    }

}
包Asg3;
导入java.util.ArrayList;
导入myUtil.sortedDarrayList;
公共类Asg3{
公共静态无效测试器(){
SorterDarrayList sorted=新的SorterDarrayList();

对于(int i=0;i我认为问题来自于列表最初为空时,因此index=-1。在这种情况下,一种可能的解决方案是在if语句中包含整个内容:

if (this.size()!=0)
{
    ...    //Your code goes here
}
else this.set(0, item);
编辑:

事实证明,问题还不止于此。这是我的最终代码;希望您能够通读它并理解我所做的更改(其中,我添加了针对特殊情况的测试)

这应该显示如下内容:

size: 21  bad insertions: 19    //This should always add up to 40, because an add() method is called 40 times in total by testInteger()
[64, 65, 155, 281, 284, 340, 363, 444, 529, 596, 600, 628, 665, 745, 782, 856, 872, 885, 891, 899, 996]
包myUtil;
@抑制警告(“串行”)
公共类SorterDarrayListExtends java.util.ArrayList
{
公共数据库列表(){}
公共列表(内部容量){}
@凌驾
公共布尔加法(T项)
{
int index=this.size();
//将项目添加到每个位置,直到找到一个可用的项目

对于(int i=0;i我认为问题来自于列表最初为空时,因此index=-1。在这种情况下,一种可能的解决方案是在if语句中包含整个内容:

if (this.size()!=0)
{
    ...    //Your code goes here
}
else this.set(0, item);
编辑:

事实证明,问题还不止于此。这是我的最终代码;希望您能够通读它并理解我所做的更改(其中,我添加了针对特殊情况的测试)

这应该显示如下内容:

size: 21  bad insertions: 19    //This should always add up to 40, because an add() method is called 40 times in total by testInteger()
[64, 65, 155, 281, 284, 340, 363, 444, 529, 596, 600, 628, 665, 745, 782, 856, 872, 885, 891, 899, 996]
包myUtil;
@抑制警告(“串行”)
公共类SorterDarrayListExtends java.util.ArrayList
{
公共数据库列表(){}
公共列表(内部容量){}
@凌驾
公共布尔加法(T项)
{
int index=this.size();
//将项目添加到每个位置,直到找到一个可用的项目

对于(int i=0;i)问题是,从现有的ARARYLIST中检索“先前”和“下一个”元素以进行比较,而不检查这些元素是否实际存在。要考虑的特殊情况是:列表是空的;在第一个元素之前插入,或者在最后一个元素之后添加。 一旦尝试的插入通过了排序检查,就可以使用
super.add(value)
super.add(position,value)
进行实际操作。据我所知,在任何时候都不需要使用set()方法


(因为这是我的家庭作业,所以我很犹豫是否提供(伪)代码,而不至少给您一个自己思考特殊情况的机会。)问题是,从现有的ARAYLIST中检索“先前”和“下一个”元素以进行比较,而不检查这些元素是否实际存在。要考虑的特殊情况是:列表是空的;在第一个元素之前插入,或者在最后一个元素之后添加。 一旦尝试的插入通过了排序检查,就可以使用
super.add(value)
super.add(position,value)
进行实际操作。据我所知,在任何时候都不需要使用set()方法


(因为这是我的家庭作业,所以我很犹豫是否提供(伪)代码,而不至少给您一个自己思考特殊情况的机会。)

好吧,当您的列表最初为空,然后添加元素时会发生什么?请更新您的代码并添加具有名称的完整类,以便我在IDE上复制粘贴完全相同的代码来为您运行和修复问题。@Waqas Ahmed,好的,只需复制并粘贴完整的代码,感谢您提供的所有解决方案。(旁注:这是一个非常讨厌的任务,因为它告诉你要故意破坏
列表
合同。)@LouisWasserman你打破列表契约是什么意思?我只是好奇而已。好吧,当你的列表最初为空,然后你添加了一个元素时会发生什么?更新你的代码,添加完整的类和名称,这样我就可以复制粘贴完全相同的代码到我的IDE上,为你运行和修复问题。@Waqas Ahmed,好的,复制并粘贴co完成代码,感谢您提出的所有解决方案。(旁注:这是一项非常棘手的任务,因为它告诉您要故意打破
列表
合同。)@LouisWasserman破坏列表契约是什么意思?我只是好奇。返回true;将必须超出if/else语句。我刚刚尝试实现您的解决方案,但得到了一个不同的错误代码。我还以为这就是问题所在……无论如何,现在的错误是:线程“main”中的异常java.lang.IndexOutOfBoundsException:Index:0,Size:0位于java.util.ArrayList.rangeCheck(未知源)位于java.util.ArrayList.set(未知源)位于myUtil.SortedArrayList.add(SortedArrayList.java:32)位于Asg3.Asg3.testinger(Asg3.java:25)位于Asg3.Asg3.main(Asg3.java:57)非常感谢您的帮助我尝试使用super.add(项)现在的问题是add(int i,T item)方法不起作用我修复了它-我想你的教授希望你做的是抛出一个IllegalArgumentException(因为他在try/catch(IllegalArgumentException e)中包围了该方法)返回true;必须跳出if/else语句。我刚刚尝试实现您的解决方案,但得到了一个不同的错误代码。我认为这也是问题所在……无论如何,现在的错误是:线程“main”java.lang.IndexOutOfBoundsException中的异常:Index:0,Size:0 at java.util.ArrayList.rangeCheck(未知源)位于myUtil.SortedArrayList.add(SortedArrayList.java:32)的java.util.ArrayList.set(未知源代码)处