我有一个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。
答案 0 :(得分:1)
我看到两个大问题:你没有将i
绑定到任何东西,你写了一个n ^ 2循环(你可以在线性时间内完成)。
假设您要删除5
给出一个类似{1,2,3,5,5}
当i = 3时,您将删除前5个,使列表看起来像:{1,2,3,5}
然后你将尝试删除i = 4处的元素,但是你要删除的元素现在真的是i = 3,你将获得IndexOutOfBoundsException
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(