Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将重复值添加到ArrayList中?_Java_Arraylist - Fatal编程技术网

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

Java 如何将重复值添加到ArrayList中?,java,arraylist,Java,Arraylist,我必须编辑字符串列表: 如果包含h字母,则删除该值; 如果它包含h和o,则不执行任何操作 如果该值包含字母o,则将其添加到列表中。 我坚持做一个复制品。 怎么了?为什么会发生这种情况 代码如下: public class MyClass { public static void main(String[] args) throws Exception { ArrayList<String> list = new ArrayList<String>(

我必须编辑字符串列表:

如果包含h字母,则删除该值; 如果它包含h和o,则不执行任何操作 如果该值包含字母o,则将其添加到列表中。 我坚持做一个复制品。 怎么了?为什么会发生这种情况

代码如下:

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

}

您正在添加一个元素,并且您正在再次检查它并再次添加一个元素。这将创建一个无限循环。这会解决你的问题。向前移动检查索引1以防止这种无限循环

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,您应该得到OOM,内存不足错误

由于您正在将第i个位置的同一对象添加到i+1位置,因此它将继续递归地添加它

代码修复 需要在最后一个else块中增加i

改变

else if (list.get(i).contains("o")) {
                // The problem is here ===>
                list.add(i + 1, list.get(i));

            }


不能修改for each循环中列表的大小。您需要为此使用迭代器:

Iterator<String> iterator = list.iterator();

您可以通过调用next方法来创建对当前对象的引用。

创建一个新的列表对象并在其中添加值,在for循环之后,您可以将新列表的所有元素添加到原始列表中,以避免在迭代添加新元素时更改的列表大小时出现无限循环

创建临时列表

List<String> newList = new ArrayList<String>();
遵守这一准则

else if (list.get(i).contains("o")) {
    newList.add(list.get(i));
}
在for循环之后,将newList附加到原始列表

list.addAll(newList);

我建议你问问给你这个作业的人。这可能意味着很多事情。问题是什么?有什么例外吗?你是说它一直在增加指针的位置?为什么不:list.addi,list.geti++@Leonid我已经提供了解决方案,如果解决了你的问题,请接受/投票
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));
}
list.addAll(newList);
 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;
            }

    }