【发布时间】:2019-07-23 23:15:20
【问题描述】:
我需要编写一个接收包含一堆人名的 ArrayList 的方法,然后根据姓名的第一个字母将此 ArrayList 分成更小的 ArrayList。像“Aaron, Albert, Ana”这样的名字必须放在一个 ArrayList 上,“Bart, Bob, Billy” 必须放在另一个上。然后我需要提供一个包含所有这些较小列表的列表。我需要为此编写一个 JUnit 测试。这是一个针对初学者 Java 课程的练习 :( 快把我逼疯了。
我曾尝试编写“for 循环”来检查每个单词的起始字符,但这一定是一种更好的方法。
这是将用作方法参数的列表:
public List<String> namesList() {
List<String> names = new ArrayList<String>();
names.add("ANA");
names.add("ANA BEATRIX");
names.add("JOE");
names.add("WALTER");
names.add("ROBERT");
names.add("RODNEY");
names.add("RUDOLPH");
names.add("VAGNER");
names.add("JOSE");
names.add("CLEITON");
names.add("MARIA");
names.add("MARK");
return names;
}
然后我尝试写方法如下:
public List<List<String>> separateNames(List<String> names) {
Collections.sort(names);
for (String s : name)
{
if (s.charAt(0) == 'A') {
// then create an ArrayList to store names starting with A
}
}
}
结果应该是列表中的一个列表,例如 [["Aaron", "Albert", "Ana"], ["Bart", "Bob", "Billy"... 等等]]
【问题讨论】:
-
return new ArrayList<>(names.stream().collect(Collectors.groupingBy(name -> name.charAt(0))).values()); -
我不明白发生了什么(我是初学者),但我认为这个解决方案完成了工作。主 ArrayList 出现故障(索引 0 的名称以“A”开头,索引 1 的名称以“R”开头),但它完成了根据名称进行拆分的工作。非常感谢!
-
如果您想对其进行排序,可以使用
Collectors.groupingBy(name -> name.charAt(0), TreeMap::new, Collectors.toList())。