[英]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.