#1。
我试图将我的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);
}
}
}
}
答案 0 :(得分:1)
理想情况下,不使用索引进行迭代,而是使用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个项目副本,然后将所有这些项目作为列表收集并将其添加到原始列表中。
答案 1 :(得分:1)
尝试:
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耗尽内存。