(Java) 如何将 CSV 文件的一列映射到不同类型的另一列?

问题描述 投票:0回答:1

所以对于这个问题,我的函数应该返回出场次数最多的前 10 名复仇者列表(在 递减顺序)。

Avenger
类中,它很像基本的
Person
类,但是没有 getter 函数,只有代表其姓名、性别、外观等的字段。

public class Avenger {
    public final String name;
    public final int appearances;
    public final String gender;
    public final int year;
    public final String honorary;
    public final String[] deaths;
    public final String[] returns;
    public final String notes;

    public Avenger(String name,
                   int appearances,
                   String gender,
                   int year,
                   String honorary,
                   String[] deaths,
                   String[] returns,
                   String notes) {
        this.name = name;
        this.appearances = appearances;
        this.gender = gender;
        this.year = year;
        this.honorary = honorary;
        this.deaths = deaths;
        this.returns = returns;
        this.notes = notes;
    }

    public static Avenger valueOf(String line) {
        String[] array = line.split(",");
        String name = array[0];
        int appearances = Integer.valueOf(array[1]);
        String gender = array[2];
        int year = Integer.valueOf(array[3]);
        String honorary = array[4];
        String[] deaths = new String[5];
        String[] returns = new String[5];
        String notes = array[15];

        int index = 5;
        int i = 0;
        while (index < 15) {
            deaths[i] = array[index++];
            returns[i] = array[index++];
            i++;
        }
        return new Avenger(name, appearances, gender, year, honorary, deaths, returns, notes);
    }

    @Override
    public String toString() {
        return "Avenger [name=" + name + ", appearances=" + appearances + ", gender=" + gender + ", year=" + year
                + ", honorary=" + honorary + ", deaths=" + Arrays.toString(deaths) + ", returns="
                + Arrays.toString(returns) + ", notes=" + notes + "]";
    }
}

我的函数正在获取顶部

10 APPEARANCES
,并且它返回的数字是正确的。

static Function<Stream<Avenger>, List<String>> getTop10ByAppearances = a -> 
a.map(s -> s.appearances).sorted((x, y) -> y - x).limit(10)
.map(p -> p.toString()).collect(Collectors.toList());

但是,我不需要它返回数字,我需要它返回与这些数字对应的

NAMES
。所以我的问题是如何将此处的内容映射到名称,然后返回这些名称的
List<String>

java list java-stream mapping
1个回答
3
投票

要先按外观排序再收集姓名,需要去掉第一个

map
操作,按外观降序比较:

sorted(Comparator.comparingInt((Avenger x) -> x.appearances).reversed())

然后,您可以限制前 10 个结果,将每个复仇者映射到他们的名字,最后收集结果。

static Function<Stream<Avenger>, List<String>> getTop10ByAppearances = a ->
                a.sorted(Comparator.comparingInt((Avenger x) -> x.appearances).reversed())
                .limit(10)
                .map(p -> p.name)
                .collect(Collectors.toList());
© www.soinside.com 2019 - 2024. All rights reserved.