首页 > 解决方案 > 如何流式传输字符串列表并根据每个项目中的数字对其进行排序

问题描述

我有一个事件列表。每个项目都有以下元素玩家名称,事件时间,事件名称,以空格分隔。玩家姓名可以是名字,也可以是名字和姓氏。示例 [“Mark 45 G”、“Rob 4 Y”、“Jude Tom 6 R”]。我想根据事件时间的时间顺序对列表进行排序。所以输出将是 ["Rob 4 Y", "Jude Tom 6 R", "Mark 45 G"] 我创建了一个带有属性 String player,int time,String event 的 Event POJO 类,带有 getter 和 setter。我想要的是这样的

List<String> events=  Arrays.asList( new String[]  {"Mark 45 G", "Rob 4 Y", "Jude Tom 6 R" });
List<Event> orderedEvents = events.stream()
               .map(a -> new Event(a[0], a[1], a[2]))
               .sorted(Comparator.comparing(Event::getTime))
               .collect(Collectors.toList());

但我不知道如何获取三个字段的字符串。由于时间可以排在第二位或第三位(如果还给出了姓氏)

标签: javastringlistjava-stream

解决方案


快完成了。您只需要将String事件正确映射到Event类。解决方案:

class Event {
    private String playerName; 
    private int time;
    private String name;

    public Event(String eventString) {
        String[] params = eventString.split(" ");
        int i = 0;
        this.playerName = params[i++];
        if (params.length == 4) {
            this.playerName += " " + params[i++];
        }
        this.time = Integer.valueOf(params[i++]);
        this.name = params[i];
    }

    public String getPlayerName() {
        return playerName;
    }

    public int getTime() {
        return time;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Event{");
        sb.append("playerName='").append(playerName).append('\'');
        sb.append(", time=").append(time);
        sb.append(", name='").append(name).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

并像这样使用它:

@Test
public void test() {
    List<String> events = Arrays.asList("Mark 45 G", "Rob 4 Y", "Jude Tom 6 R");
    List<Event> orderedEvents = events.stream()
            .map(eventString -> new Event(eventString))
            .sorted(Comparator.comparingInt(Event::getTime))
            .collect(Collectors.toList());
    System.out.println(orderedEvents);
}

推荐阅读