如何将重复值添加到ArrayList中?

时间:2014-12-15 10:59:38

标签: java arraylist

我必须编辑String列表:

  1. 如果值包含“h”字母,请删除该值;
  2. 如果包含“h”和“o”
  3. 则不执行任何操作
  4. 如果值包含字母“o”,则将值添加到列表中。
  5. 我坚持做一个重复的步骤。 怎么了?为什么会发生?

    以下是代码:

    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);
    

5 个答案:

答案 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 locationi+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;
            }

    }