我需要比较并保留Java流中的多个值
我正在使用流重写一个方法,但我有点卡住了。对于短篇小说来说,它是一种用于检索玩家可用技能的方法。整个技能列表存储在玩家模板中(getTemplate(),列表可通过getTemplate()访问。getSkills())。玩家还拥有自己的已知技能,存储在地图中(在本例中,我只使用getSkillLevel,如果已知,它只返回技能级别,如果未知,则返回-1) 它必须通过某些条件进行过滤,例如:我需要比较并保留Java流中的多个值,java,Java,我正在使用流重写一个方法,但我有点卡住了。对于短篇小说来说,它是一种用于检索玩家可用技能的方法。整个技能列表存储在玩家模板中(getTemplate(),列表可通过getTemplate()访问。getSkills())。玩家还拥有自己的已知技能,存储在地图中(在本例中,我只使用getSkillLevel,如果已知,它只返回技能级别,如果未知,则返回-1) 它必须通过某些条件进行过滤,例如: 模板技能必须是玩家可以“学习”的,根据当前玩家等级(过滤内容) 如果玩家还不知道该技能(getSkil
- 模板技能必须是玩家可以“学习”的,根据当前玩家等级(过滤内容)
- 如果玩家还不知道该技能(getSkillLevel的结果==-1),或者如果当前玩家的技能水平低于模板技能,则会在列表中添加模板技能
- 技能id(名为getId())
- 技能级别(命名为getValue())
- 学习它的最低级别(名为getMinLvl())
/**
* @return a {@link Collection} of all available {@link GeneralSkillNode}s (being general or autoGet) <b>of maximal level</b> for this {@link Player}.
*/
public Collection<GeneralSkillNode> getAllAvailableSkills()
{
final List<GeneralSkillNode> result = new ArrayList<>();
getTemplate().getSkills().stream().filter(s -> s.getMinLvl() <= getLevel()).forEach(s ->
{
final int playerSkillLevel = getSkillLevel(s.getId());
if (playerSkillLevel == -1 || playerSkillLevel < s.getValue())
result.add(s);
});
return result;
}
/**
*@return此{@link Player}的最大级别的所有可用{@link GeneralSkillNode}的{@link Collection}(通用或自动获取)。
*/
公共集合getAllAvailableSkills()
{
最终列表结果=新建ArrayList();
getTemplate().getSkills().stream().filter(s->s.getMinLvl())
{
final int playerSkillLevel=getSkillLevel(s.getId());
如果(playerSkillLevel==-1 | | playerSkillLevel
编辑:感谢您的帮助,最终版本现在看起来是这样的:
/**
* @return a {@link Collection} of all available {@link GeneralSkillNode}s (being general or autoGet) <b>of maximal level</b> for this {@link Player}.
*/
public Collection<GeneralSkillNode> getAllAvailableSkills()
{
final List<GeneralSkillNode> result = new ArrayList<>();
getTemplate().getSkills().stream().filter(s -> s.getMinLvl() <= getLevel()).collect(Collectors.groupingBy(s -> s.getId(), Collectors.maxBy(Comparator.comparing(s -> s.getValue())))).forEach((i, s) ->
{
final int playerSkillLevel = getSkillLevel(i);
if (playerSkillLevel == -1 || playerSkillLevel < s.get().getValue())
result.add(s.get());
});
return result;
}
/**
*@return此{@link Player}的最大级别的所有可用{@link GeneralSkillNode}的{@link Collection}(通用或自动获取)。
*/
公共集合getAllAvailableSkills()
{
最终列表结果=新建ArrayList();
getTemplate().getSkills().stream().filter(s->s.getMinLvl()s.getId(),Collectors.maxBy(Comparator.comparing(s->s.getValue())))).forEach((i,s)->
{
最终整数playerSkillLevel=getSkillLevel(i);
如果(playerSkillLevel==-1 | | playerSkillLevel
要获得每项技能的最高级别,您可以执行分组操作
来分离每项技能,然后执行最大级别操作
,以获得每项技能的最高级别
getTemplate().getSkills().stream().filter(s -> s.getMinLvl() <= getLevel())
.collect(Collectors.groupingBy(s -> s.getId(),
Collectors.maxBy(Comparator.comparing(s -> s.getValue()))));
getTemplate(),
Collectors.maxBy(Comparator.comparing(s->s.getValue());
您能操作GeneralSkillNode的值吗?比如“更新”技能水平?或者您可以重写GeneralSkillNode.equals()和GeneralSkillNode.hashCode()方法吗?这些节点是从XML数据生成的,不愿意动态编辑(在服务器启动时加载一次,然后再也不处理)。如果需要的话,我可以重写GeneralEquals/hashCode,是的。我将对其进行测试,并很快进行检查,谢谢你的关注!:)