如何将Stud7数组转换为指定格式的Stream<String>(Java)
问题:将Stud7数组转换为指定格式的Stream
需求:将Stud7类型的数组转换为格式如“Mike: [4, 5, 3]”的Stream<String>,要求不使用toString()方法。
示例代码
Map<String, List<Integer>> markAnn = new HashMap<>(); markAnn.put("Physics", List.of(4,4,5)); markAnn.put("Mathematics", List.of(2,3,4)); Map<String, List<Integer>> markKate = new HashMap<>(); markKate.put("Physics", List.of(1,2,3)); markKate.put("Mathematics", List.of(5,5,3)); Stud7[] students = { new Stud7("Ann", markAnn), new Stud7("Kate", markKate) };
我的尝试(未成功)
class Lesson7 { public static void main(String[] args) { Map<String, List<Integer>> markAnn = new HashMap<>(); markAnn.put("Physics", List.of(4,4,5)); markAnn.put("Mathematics", List.of(2,3,4)); Map<String, List<Integer>> markKate = new HashMap<>(); markKate.put("Physics", List.of(1,2,3)); markKate.put("Mathematics", List.of(5,5,3)); Stud7[] students = { new Stud7("Ann", markAnn), new Stud7("Kate", markKate) }; String[] strings = new String[students.length]; Stream<String> StreamName = Arrays.stream(students).map(Stud7::getName); Stream<Integer>StreamMarks = Arrays.stream(students) .flatMap(s -> s.getMarks().values().stream()) .flatMap(Collection::stream); Stream.concat(StreamName, StreamMarks). } private static class Stud7 { private String name; private Map<String, List<Integer>> marks; public Stud7(String name, Map<String, List<Integer>> marks) { this.name = name; this.marks = marks; } public String getName() { return name; } public Map<String, List<Integer>> getMarks() { return marks; } } }
正确实现方法
你之前的思路错误在于把所有学生的名字流和所有分数流合并,这样无法对应每个学生的名字与自己的分数。正确的做法是逐个处理每个Stud7对象,将每个学生的名字和自己的所有分数拼接成目标格式的字符串。
完整实现代码
import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; class Lesson7 { public static void main(String[] args) { Map<String, List<Integer>> markAnn = new HashMap<>(); markAnn.put("Physics", List.of(4,4,5)); markAnn.put("Mathematics", List.of(2,3,4)); Map<String, List<Integer>> markKate = new HashMap<>(); markKate.put("Physics", List.of(1,2,3)); markKate.put("Mathematics", List.of(5,5,3)); Stud7[] students = { new Stud7("Ann", markAnn), new Stud7("Kate", markKate) }; // 生成目标格式的Stream<String> Stream<String> studentMarksStream = Arrays.stream(students) .map(student -> { // 收集当前学生的所有分数到一个列表 List<Integer> allMarks = student.getMarks().values().stream() .flatMap(List::stream) .collect(Collectors.toList()); // 手动格式化分数列表为[4, 5, 3]格式(不使用toString) String marksStr = "[" + allMarks.stream() .map(String::valueOf) .collect(Collectors.joining(", ")) + "]"; // 拼接名字和分数字符串 return student.getName() + ": " + marksStr; }); // 验证输出 studentMarksStream.forEach(System.out::println); } private static class Stud7 { private String name; private Map<String, List<Integer>> marks; public Stud7(String name, Map<String, List<Integer>> marks) { this.name = name; this.marks = marks; } public String getName() { return name; } public Map<String, List<Integer>> getMarks() { return marks; } } }
代码说明
- 逐个处理学生对象:使用
Stream.map()对每个Stud7对象进行转换,确保名字和分数一一对应。 - 合并所有分数:通过
flatMap(List::stream)将每个科目的分数列表展开,合并成一个包含所有分数的列表。 - 格式化分数字符串:利用
Collectors.joining()将分数列表拼接成x, y, z的格式,再手动包裹方括号,避免使用列表的toString()方法。 - 拼接最终字符串:将学生名字和格式化后的分数字符串组合成目标格式。
运行这段代码会输出:
Ann: [4, 4, 5, 2, 3, 4] Kate: [1, 2, 3, 5, 5, 3]
内容的提问来源于stack exchange,提问作者Kto Tam
相关产品推荐
相关产品推荐

