You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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;
        }
    }
}

代码说明

  1. 逐个处理学生对象:使用Stream.map()对每个Stud7对象进行转换,确保名字和分数一一对应。
  2. 合并所有分数:通过flatMap(List::stream)将每个科目的分数列表展开,合并成一个包含所有分数的列表。
  3. 格式化分数字符串:利用Collectors.joining()将分数列表拼接成x, y, z的格式,再手动包裹方括号,避免使用列表的toString()方法。
  4. 拼接最终字符串:将学生名字和格式化后的分数字符串组合成目标格式。

运行这段代码会输出:

Ann: [4, 4, 5, 2, 3, 4]
Kate: [1, 2, 3, 5, 5, 3]

内容的提问来源于stack exchange,提问作者Kto Tam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:17:54