将对象插入到arraylist中

时间:2013-09-16 20:40:31

标签: java

我有一个50个RANDOM整数的arraylist。我要求用户删除一个号码,并从列表中删除该号码的所有出现。我是用

做的
while (randInts.contains(removeInt) )
{
  if (randInts.get(i) == removeInt)                 
   randInts.remove(randInts.get(i));
   i++;             

 } 

 System.out.println("\n" + randInts.toString());
 System.out.println("\n" + randInts.size());`

问题的另一部分是提示用户输入另一个号码。在每次出现第二个提示号码后插入从上面删除的号码。我在第二部分遇到问题,因为我一直得到IndexOutOfBoundsException。

8 个答案:

答案 0 :(得分:1)

我看到两个大问题:你没有将i绑定到任何东西,你写了一个n ^ 2循环(你可以在线性时间内完成)。

你正在缩小“List”的大小......举个简单的例子:

假设您要删除5

的所有实例

给出一个类似{1,2,3,5,5}

的列表

当i = 3时,您将删除前5个,使列表看起来像:{1,2,3,5}

然后你将尝试删除i = 4处的元素,但是你要删除的元素现在真的是i = 3,你将获得IndexOutOfBoundsException

你不想使用`contains`,因为这会将你的循环的最坏情况性能扩展到n ^ 2,这会更快:

int size = randInts.size() - 1;
for (int i = size; i >= 0; i--){
   if (randInts.get(i).equals(removeInt))
       randInts.remove(i);
}

答案 1 :(得分:1)

使用LinkedList代替;当你需要按顺序遍历但不是真正的随机访问时,以及当你需要在列表中间插入和删除元素时,这是一个更好的选择。

您可以通过对列表迭代器的简单遍历来完成您想要的任务(删除removeInt的所有实例并在removeInt的每个实例之后插入insertAfterInt):

ListIterator<Integer> li = randInts.listIterator();
while(li.hasNext()) {
    int i = li.next();
    if(removeInt == i)     // assumes removeInt is an int; use equals() for Integer
        li.remove();
    if(insertAfterInt == i)
        li.add(removeInt);  // the iterator will skip this element, so it won't get removed
}

答案 2 :(得分:0)

if (randInts.get(i) == removeInt)                 
randInts.remove(randInts.get(i));
i++;  

你永远不会检查停止条件。修复是:

while (randInts.contains(removeInt) )
{
    i=0;
   while(i<randInts.size()){

  if (randInts.get(i) == removeInt)                 
   randInts.remove(randInts.get(i));
   i++;             
}
 } 

答案 3 :(得分:0)

while (randInts.contains(removeInt) )
{

   if(i<randInts.size());
    {
  if (randInts.get(i) == removeInt)                 
   randInts.remove(randInts.get(i));
     }//if
   i++;             

 }while

答案 4 :(得分:0)

我猜你开始收集50个项目(randInts)并删除用户输入的项目(i)?

如果是这种情况,一旦删除了一个项目,那么你的集合只剩下49个索引,get得到索引。尝试类似......

if (randInts.contains(i)){
     randInts.remove(randInts.indexOf(i));
}

答案 5 :(得分:0)

这是n ^ 2,但它应该有效

int i = 0;

    while(i < loFnumbers.size()){
        if(loFnumbers.get(i) == removeInt){
            loFnumbers.remove(i);
            continue;
        }
        i++;

    }

答案 6 :(得分:0)

这是一种避免任何状态突变的方法(即永远不会修改randInts):

package so;

import java.util.ArrayList;

public class SO_18836900 {

  public static void main(String[] args) {

    // build a collection of random ints
    ArrayList<Integer> randInts = new ArrayList();
    for (int i = 0; i < 50; i ++) {
      randInts.add((int)(Math.random() * 5));
    }

    // create a collection with all 3s filtered out
    ArrayList<Integer> filtered = filterOut(randInts, 3);
    System.out.println(filtered);
    System.out.println(filtered.size());

    // create a collection with a 99 inserted after each 4
    ArrayList<Integer> insertedAfter = insertAfter(randInts, 4, 99);
    System.out.println(insertedAfter);
    System.out.println(insertedAfter.size());

  }

  static ArrayList<Integer> filterOut(Iterable<Integer> xs, int toRemove) {
    ArrayList<Integer> filteredInts = new ArrayList();
    for (int x : xs) {
      if (x != toRemove) filteredInts.add(x);
    }
    return filteredInts;
  }

  static ArrayList<Integer> insertAfter(Iterable<Integer> xs, int trigger, int toInsert) {
    ArrayList<Integer> insertedAfter = new ArrayList();
    for (int x : xs) {
      insertedAfter.add(x);
      if (x == trigger) insertedAfter.add(toInsert);
    }
    return insertedAfter;
  }

}

答案 7 :(得分:-1)

不要在“整数”上使用==你正在比较参考文献 将unbox转换为int或使用equals(