向 ArrayList 添加重复值

Adding duplicate values to ArrayList

计算器。

我正在尝试将 ArrayList 中的每个单词中的 4 个添加到 ArrayList 本身。我的 ArrayList 中有两个字符串。一个是 "java",另一个是 "Program"。我正在尝试编写一个程序,每个单词总共添加 4 个单词。例如:我正在尝试添加 4 x java 和 4 x 程序。

这是我目前所知道的。我不知道,我做错了什么。 任何帮助或提示将不胜感激。

 /*
  * Write a method called quadList that takes an ArrayList of strings as a parameter
   *  and replaces every string with four of that same string. 
   *  For example, if the list stores the values ["java", "program"] 
   *  before the method is called,it should store the values 
   *  ["java ", " java ", " java ", " java ", "program", "program", "program", "program"]
   *   after the method finishes executing.
   */
  import java.util.ArrayList;


  public class Ex10_4_quadList {

public static void main(String[] args) {

    ArrayList<String> arrList = new ArrayList<String>();

    arrList.add("Java");
    arrList.add("Program");

    System.out.println("Before: " + arrList);
    quadList(arrList);
    System.out.println("after " + arrList);

}

private static void quadList(ArrayList<String> list) {

    for (int i = 0; i < list.size(); i++) {

        for (int j = 0; j < 4; j++) {
            String temp = list.get(i);
            list.add(temp);

        }

    }

}

  }

固定代码如下:

 public class Ex10_4_quadList {

public static void main(String[] args) {

    ArrayList<String> arrList = new ArrayList<String>();

    arrList.add("Java");
    arrList.add("Program");

    System.out.println("Before: " + arrList);
    quadList(arrList);
    Collections.sort(arrList);
    System.out.println("after " + arrList);

}

private static void quadList(ArrayList<String> list) {

    int initial = list.size();

    for (int i = 0; i < initial; i++) {

        for (int j = 0; j < 3; j++) {
            String temp = list.get(i);
            list.add(temp);

        }

    }

}

 }

理想情况下,您可以使用 foreach 循环样式,而不是使用索引进行迭代。然而,这意味着您不能在迭代时更改列表。因此,您需要将成员添加到新列表,然后再添加所有成员:

List<String> duplicates = new ArrayList<>();
for (String member: list) {
    for (int i = 0; i < 4; i++) {
        duplicates.add(member);
    }
}
list.addAll(duplicates);

如果您使用的是 Java 8,则可以使用许多快捷方式,因此可以访问流:

list.addAll(list.stream()
    .flatMap(m -> Stream.generate(() -> m).limit(4))
    .collect(Collectors.toList());

此代码表示,对于列表中的每个成员,将其转换为该项目的 4 个副本,然后将所有这些副本收集为一个列表,并将它们添加到原始列表中。

尝试:

private static void quadList(ArrayList<String> list) {

    int listSize = list.size();

    for (int i = 0; i < listSize; i++) {

        for (int j = 0; j < 4; j++) {
            String temp = list.get(i);
            list.add(temp);

        }

    }

}

代码的问题在于 list.size() 在每次迭代时都会被评估。由于内部循环增加列表大小的速度快于外部循环对其进行迭代的速度,因此代码有效地无限循环,直到 JVM 内存耗尽。