Java 在保持排序顺序的同时添加到ArrayList的问题
所以我的家庭作业有问题。本质上,我们必须创建SorterDarrayList类,该类扩展java.util.ArrayList,并重写ArrayList的默认add方法,以便我们可以维护从最低到最高的整数排序列表 下面是我的教授给全班的代码,用来测试我们的方法: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
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(未知源代码)处