将对象添加到 ArrayList

3

通过for循环向ArrayList添加对象是否可行?

我想缩短代码!您有没有其他关于如何创建具有不同类和方法的单词测验的提示?

我有三个类,Main驱动游戏,Quiz构建游戏,以及一个包含所有单词的字典的类。

ArrayList<Sweng> Wordlist = new ArrayList<Sweng>();

Sweng s1 = new Sweng("bil", "car");
Sweng s2 = new Sweng("blå", "blue");
Sweng s3 = new Sweng("baka", "bake");
Sweng s4 = new Sweng("hoppa", "jump");
Sweng s5 = new Sweng("simma", "swim");
Sweng s6 = new Sweng("måne", "moon");
Sweng s7 = new Sweng("väg", "road");
Sweng s8 = new Sweng("snäll", "kind");
Sweng s9 = new Sweng("springa", "run");
Sweng s10 = new Sweng("hus", "house");


Wordlist.add(s1);
Wordlist.add(s2);
Wordlist.add(s3);
Wordlist.add(s4);
Wordlist.add(s5);
Wordlist.add(s6);
Wordlist.add(s7);
Wordlist.add(s8);
Wordlist.add(s9);
Wordlist.add(s10);

你可以消除s#变量:Wordlist.add(new Sweng("bil", "car")); ... - Eran
Arrays.asList(new Sweng(...), new Sweng(...)): Arrays.asList(new Sweng(...), new Sweng(...)) - Chris Neve
@ChrisNeve:从Java 9开始,我建议使用List.of(new Sweng(...), new Sweng(...), ...) - Joachim Sauer
带有所有单词的字典的类。这些单词是如何存储的?是在*.txt还是*.json文件中? - PsyGik
5个回答

2

以下是使用Java流的示例,不过考虑到您目前在Java方面的水平,我建议除非您是专业人士,否则不要使用此答案,因为它有点高级。

import java.util.Arrays;
import static java.util.stream.Collectors.toList;
import java.util.List;

class Sweng {
    Sweng(String a, String b) {}
}

public class Main{

     public static void main(String[] args){
        List<Sweng> swengs = Arrays.stream(new String [][]{
          {"bil", "car"},
          {"blå", "blue"},
          ...
        }).map(t -> new Sweng(t[0], t[1])).collect(toList());
     }
}

您可以在省略号(“...”)处添加任意长度的新元素到列表中。


不要误会我,但我真的不明白为什么你会提出一个你不建议使用的答案..或者为什么不多解释一些-如果它仍然被提出的话?对我个人来说,这似乎有点过于繁琐。 - Giorgi Tsiklauri
我怀疑OP是为了某个课程的练习而这样做,我不想让他们因为明显地从StackOverflow上某个专业的Java工程师那里抄袭答案而陷入麻烦。然而,对于其他更资深的工程师在专业环境中需要解决这个问题并在SO上找到这个答案的人来说,这个答案是值得放在这里的。我会更新答案以更清楚地表达这一点,谢谢。 - Software Engineer

2
您可以定义两个不同的字符串数组,每个数组包含您的Object类的每个字段的字符串数据:
String [] array1 = {"bil", "blå", "baka", "hoppa", ... };
String [] array2 = {"car", "blue", "bake", "jump", ... };

然后按照以下方式将对象添加到Wordlist中:

ArrayList<Sweng> Wordlist = new ArrayList<Sweng>();
for (int i=0; i<array1.length; i++)
    Wordlist.add(new Sweng(array1[i], array2[i]));

虽然看起来很不错并且性能也良好,但它也可能很脆弱:如果将来有人向array1中添加N个瑞典语单词,并向array2添加(N-1)个英语翻译(漏掉一个翻译),那么_所有_后续的翻译都会是错误的。 - k314159

1

虽然不使用for循环,但这可能仍有帮助。

ArrayList<Sweng> Wordlist = new ArrayList<Sweng>();

Wordlist.add(new Sweng("bil", "car"));
Wordlist.add(new Sweng("blå", "blue"));
Wordlist.add(new Sweng("baka", "bake"));
Wordlist.add(new Sweng("hoppa", "jump"));
Wordlist.add(new Sweng("simma", "swim"));
Wordlist.add(new Sweng("måne", "moon"));
Wordlist.add(new Sweng("väg", "road"));
Wordlist.add(new Sweng("snäll", "kind"));
Wordlist.add(new Sweng("springa", "run"));
Wordlist.add(new Sweng("hus", "house"));

这与其他问题有何不同,除了不创建额外的变量之外? ;) - PsyGik
OP明确表示:“我想缩短代码!” ;) - Vasconcelos
哈哈,你抓住我了!但是 OP 也提到了 for 循环,所以答案不完整。 - PsyGik
如果没有关于 OP 想要添加到他们的 ArrayList 的数据来源的其他信息,我无法使用 for 循环提供答案。如果 OP 表示数据来自文件、从辅助数组中检索或类似的操作,我可以提供更详细的答案。没有更多的信息,这就是我能提供的帮助。 - Vasconcelos

1
让我们重新考虑并思考一下你所要求的内容。 确实,可以缩短几行“实例化和添加”代码,即:
Sweng s1 = new Sweng("whatever..", "whatever..");
...
Sweng sk = new Sweng("whatever..", "whatever..");

instance.add(s1);
...
instance.add(sk);

但请稍等片刻...并且注意您实例化对象的方式,然后将其添加到列表中。
数据从哪里来?有任何系统性的读取过程吗?
没有。
您只是硬编码了任何想到的内容(或在任务中要求的内容),没有任何程序可以猜测这些数据应该是什么。
或者,您可以创建一个简单的文本文件,并用一些传统格式(比如说,每行一个条目)将数据写入其中。然后,您可以在一个简单的循环结构中读取该文件并填充相应的对象-因此,将它们添加到您的列表中。

0

代码片段 1

List<Sweng> Wordlist = Arrays.asList(
    new Sweng("bil", "car"),
    new Sweng("blå", "blue"),
    new Sweng("baka", "bake"),
    new Sweng("hoppa", "jump"),
    new Sweng("simma", "swim")
    new Sweng("måne", "moon")
    new Sweng("väg", "road")
    new Sweng("snäll", "kind")
    new Sweng("springa", "run")
    new Sweng("hus", "house")
);

代码片段 2

List<Sweng> Wordlist = List.of(
    new Sweng("bil", "car"),
    // ...
);

片段 3(反模式) 双括号初始化

List<Sweng> list = new ArrayList<Sweng>() {{
    add(new Sweng("bil", "car"));
    // ...
}};

2
我不会建议在没有注释的情况下使用双括号初始化。这里并不需要它,而且我个人认为它是一种反模式。 - Joachim Sauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接