Java 正在尝试删除arraylist中第一个出现的数字 publicstaticvoidmain(字符串[]args){ 扫描仪输入=新扫描仪(System.in); System.out.println(“输入一些数字(全部在一行上,用空格分隔):”; String line=input.nextLine(); 字符串[]数字=行。拆分(“+”); ArrayList a=新的ArrayList(); 对于(int i=0;i
您不能在没有Java 正在尝试删除arraylist中第一个出现的数字 publicstaticvoidmain(字符串[]args){ 扫描仪输入=新扫描仪(System.in); System.out.println(“输入一些数字(全部在一行上,用空格分隔):”; String line=input.nextLine(); 字符串[]数字=行。拆分(“+”); ArrayList a=新的ArrayList(); 对于(int i=0;i,java,arraylist,Java,Arraylist,您不能在没有迭代器的情况下迭代ArrayList并同时修改它 这样做: public static void main(String [] args){ Scanner input = new Scanner(System.in); System.out.println("Enter some numbers (all on one line, separated by spaces):"); String line = input.nextLine(); String[] numb
迭代器的情况下迭代ArrayList
并同时修改它
这样做:
public static void main(String [] args){
Scanner input = new Scanner(System.in);
System.out.println("Enter some numbers (all on one line, separated by spaces):");
String line = input.nextLine();
String[] numbers = line.split(" +");
ArrayList<Integer> a = new ArrayList<Integer>();
for(int i=0; i<numbers.length; i++)
a.add(new Integer(numbers[i]));
System.out.println("The numbers are stored in an ArrayList");
System.out.println("The ArrayList is "+a);
System.out.print("\nEnter a number: ");
int p = input.nextInt();
System.out.println(removeNumber(a,p));
System.out.println(removeNumber2(a,p));
}
public static <T> ArrayList<T> removeNumber(ArrayList<T> a, Integer e)
{
ArrayList<T> b = new ArrayList<T>();
for(int i = 0; i< a.size();i++)
{
if (a.get(i).equals(e))
a.remove(e);
}
return a;
}
for(迭代器i=a.Iterator();i.hasNext();)
{
如果(i.next().equals(e.value))
{
i、 删除();
}
}
顺便说一句,您的b ArrayList是无用的。除了建议使用迭代器外,您不应该使用检查引用相等性的运算符==。在您的场景中,这将始终是错误的。您希望使用检查值相等性的equals方法
for(Iterator<T> i = a.iterator(); i.hasNext();)
{
if (i.next().equals(e.value))
{
i.remove();
}
}
您不需要使用迭代器或索引对列表进行迭代。ArrayList
有一个remove
方法来搜索和删除元素,并根据是否找到要删除的元素返回true
或false
if (a.get(i).equals((Integer)e.value)))
或
或者如果你看重简洁而不是可读性
boolean found;
do {
found = a.remove(e.value);
} while(found);
请注意,a.remove(e)
,正如您在原始代码中所做的那样,根本不起作用。ArrayList
是Integer
的ArrayList
,但e
是EX6
。因此,a.remove(e)
在列表中根本找不到e
,因为它甚至不是正确的类型。它应该可以编译,因为remove
被定义为允许任何对象作为参数,但它永远找不到任何东西(由于Integer
的equals
方法对于非整数
总是返回false
)。无需使用迭代器,以下是修复代码的方法:
do { } while(a.remove(e.value));
for(int i=0;i
除了将=
更改为equals
之外,每当您从ArrayList
中删除一个元素时,您必须将i
减量。原因是从ArrayList
中删除i
第th个元素会将其后所有元素的索引减少一个。因此,i+1
th元素将成为新的i
th元素,因此必须减小i
,以免跳过下一个元素
编辑:出于某种原因,我确信您想从列表中删除所有出现的数字,而不仅仅是第一个。如果您只想从列表中删除一个元素,您不必担心删除该元素后会在列表的其余部分进行迭代。“不想使用迭代器”:为什么?不要使用=
来计算对象的相等性。我还没有使用迭代器。当您从列表中删除项目时,使用索引来逐步遍历列表是非常小心的。如果列表是[3,5,5,6],并且您要删除5,那么当i=1
时,您删除5
,列表变成[3,5,6].但在再次检查之前,您将i
增加到2,这意味着您错过了其中一个元素。a.remove(e)
不起作用,因为e
是EX6
,而a
不是ArrayList
。我假设您在这一行中遇到了错误?有两种方法可以正确使用remove
,请参见。我认为也不应该使用==运算符。我会说==检查引用是否相等,而不是对象e质量,这在我看来是模糊的注意,这是O(n^2),因为我们每次都必须从列表的开头重新开始搜索值。对于列表较小的练习,我认为这是可以的。如果涉及到非常大的列表,我不会这样做,但我也不会使用remove(int-index)
每次删除某个内容时都必须移动元素,使其成为O(n^2)再次强调。需要一个不同的算法。另外,我个人不赞成修改for
循环体中的索引,但这是一个风格问题。我认为这会使事情更难遵循。在这样一个短循环中,这不是一个大问题,但我会避免它并使用,而@ajb-Oops,我完全忽略了这一点。这就是发生的事情当您从问题中复制和粘贴代码,并仅修复您认为错误的内容时,就会出现错误。
do { } while(a.remove(e.value));
for(int i = 0; i< a.size();i++) {
if (a.get(i).equals(e.value)) {
a.remove(e.value);
i--;
}
}