我必须编辑String列表:
我坚持做一个重复的步骤。 怎么了?为什么会发生?
以下是代码:
public class MyClass {
public static void main(String[] args) throws Exception {
ArrayList<String> list = new ArrayList<String>();
list.add("hi"); // this one have to be removed
list.add("hello"); // this one have to be left without changes
list.add("ops"); // duplicate must be added to the list
list = fix(list);
for (String s : list) {
System.out.println(s);
}
}
public static ArrayList<String> fix(ArrayList<String> list) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).contains("h") && list.get(i).contains("o")) ;
// do nothing
else if (list.get(i).contains("h"))
list.remove(i);
else if (list.get(i).contains("o")) {
// The problem is here ===>
list.add(i + 1, list.get(i));
}
}
return list;
}
}
我也尝试过:
String s = new String(list.get(i));
list.add(i+1, s);
答案 0 :(得分:2)
您正在添加一个元素,并且您正在再次检查它并再次添加一个元素。这会产生无限循环。这将解决您的问题。向前移动检查索引以防止这种无限循环
else if (list.get(i).contains("h"))
{
list.remove(i);
i--;
}
else if (list.get(i).contains("o"))
{
list.add(i+1, list.get(i));
i++;
}
此外,删除元素时需要减少i
答案 1 :(得分:1)
你应该得到 OOM,Out of Memory Error 。
由于您同时添加ith location
到i+1 location
的同一个对象,因此它会继续以递归方式添加它。
代码修复
需要在i
中增加last else block
。
更改
else if (list.get(i).contains("o")) {
// The problem is here ===>
list.add(i + 1, list.get(i));
}
TO
else if (list.get(i).contains("o")) {
// The problem is here ===>
list.add(i + 1, list.get(i));
i++;
}
答案 2 :(得分:0)
您无法修改for-each循环内List
的大小。你需要使用Iterator:
Iterator<String> iterator = list.iterator();
然后
while (iterator.hasNext()) {
String someString = iterator.next();
//your code
list.add(someString); //if you need to do that
}
通过调用next()
方法创建对当前对象的引用。
答案 3 :(得分:0)
创建一个新的列表对象并在其中添加值,并且在for循环之后,您可以在原始列表中添加新列表的所有元素以避免无限循环(因为您正在迭代列表大小,当您是添加新元素。)
创建临时列表
List<String> newList = new ArrayList<String>();
更改以下代码
else if (list.get(i).contains("o")) {
list.add(i+1, list.get(i));
}
到此代码
else if (list.get(i).contains("o")) {
newList.add(list.get(i));
}
After for loop
将newList附加到原始列表。
list.addAll(newList);
答案 4 :(得分:0)
public class MyClass
{
public static void main(String[] args) throws Exception
{
ArrayList<String> list = new ArrayList<String>();
list.add("hi"); // this one have to be removed
list.add("hello"); // this one have to be left without changes
list.add("ops"); // duplicate must be added to the list
list = fix(list);
for (String s : list)
{
System.out.println(s);
}
}
public static ArrayList<String> fix(ArrayList<String> list) {
ArrayList<String>tempList=new ArrayList<>();
for (int i = 0; i < list.size(); i++){
if (list.get(i).contains("h") && list.get(i).contains("o"))
{
tempList.add(list.get(i));
}
else if (list.get(i).contains("o"))
{
tempList.add(list.get(i));
tempList.add(list.get(i));
}
}
return tempList;
}
}