繁体   English   中英

如何 stream 字符串列表并根据每个项目中的数字对其进行排序

[英]How to stream a string list and sort it based on a number in each item

我有一个事件列表。 每个项目都有以下元素玩家名称,事件时间,事件名称,以空格分隔。 玩家姓名可以是名字,也可以是名字和姓氏。 示例 [“Mark 45 G”、“Rob 4 Y”、“Jude Tom 6 R”]。 我想根据事件时间的时间顺序对列表进行排序。 所以 output 将是 ["Rob 4 Y", "Jude Tom 6 R", "Mark 45 G"] 我创建了一个事件 POJO class 属性字符串播放器,int时间,字符串事件,带有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());

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

快完成了。 您只需要将String事件正确地 map 到Event class。 解决方案:

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);
}

一种自定义如何拆分字符串的方法。

      String[] str = { "Mark 45 G", "Rob 4 Y", "Jude Tom 6 R"
      };
      Function<String, String[]> split = a ->
      {
         String[] p = a.split("\\s+");
         if (p.length > 3) {
            p = new String[] { p[0] + " " + p[1], p[2], p[3]
            };
         }
         return p;
      };

      for (String s : str) {
         String[] parts = split.apply(s);
         System.out.println(Arrays.toString(parts));
      }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM