试图删除arraylist中第一次出现的数字

时间:2014-10-09 15:08:49

标签: java 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;

}

如果ex.value = 4,我想从arrayList中删除4。如果我的arraylist包含[5,12,4,16,4],我想删除它的第一个出现的四个,并将其保存到另一个arraylist。 不想使用迭代器

4 个答案:

答案 0 :(得分:0)

您不能迭代ArrayList并同时修改它,而不是Iterator

这样做:

for(Iterator<T> i = a.iterator(); i.hasNext();)
{
    if (i.next().equals(e.value))
    {
        i.remove();
    }
}

BTW,你的b ArrayList是无用的。

答案 1 :(得分:0)

除了使用迭代器的建议外,您不应该使用运算符==来检查引用相等性。在您的方案中,这始终是错误的。您希望使用equals方法来检查值的相等性。

if (a.get(i).equals((Integer)e.value)))

答案 2 :(得分:0)

您无需使用迭代器或索引遍历列表。 ArrayListremove方法搜索并删除元素,返回truefalse,具体取决于是否找到要删除的元素。所以你可以说

while (true) {
    boolean found = a.remove(e.value);
    if (!found) {
        break;
    }
}

boolean found;
do {
    found = a.remove(e.value);
} while(found);

或者如果你认为紧凑性超过可读性,

do { } while(a.remove(e.value));

请注意,原始代码中的a.remove(e)根本不起作用。 ArrayListArrayList Integer,但eEX6。因此,a.remove(e)根本不会在列表中找到e,因为它甚至不是正确的类型。它应该编译正常,因为remove被定义为允许任何Object作为参数,但它永远不会找到任何东西(因为equals Integer方法始终返回{{ 1}}表示非false)。

答案 3 :(得分:0)

不使用迭代器,您可以采取以下措施来修复代码:

    for(int i = 0; i< a.size();i++) {
        if (a.get(i).equals(e.value)) {
            a.remove(e.value);
            i--;
        }
    }

除了==更改为equals之外,每当您从i删除元素时,都必须递减ArrayList。这样做的原因是从i中删除ArrayList元素会将跟随它的所有元素的索引减少一个。因此,i+1元素将成为新的i元素,因此您必须递减i以便不跳过下一个元素。

编辑:出于某种原因,我确信您要从列表中删除所有出现的号码,而不仅仅是第一个号码。如果您只想从列表中删除一个元素,则不必担心在删除该元素后迭代列表的其余部分。