下面的方法是用于选择歌曲的加权随机选择算法的一部分。
我想将下面的方法转换为使用流,以确定是否更清晰/更可取。我不确定这是否可能,因为计算是一种有状态的操作,依赖于列表中的位置。
更正式地说:如果
注意:超出范围的行为可以修改以适应流(而不是返回null)。
我想将下面的方法转换为使用流,以确定是否更清晰/更可取。我不确定这是否可能,因为计算是一种有状态的操作,依赖于列表中的位置。
public Song songForTicketNumber(long ticket)
{
if(ticket<0) return null;
long remaining = ticket;
for(Song s : allSongs) // allSongs is ordered list
{
rem-=s.numTickets; // numTickets is a long and never negative
if(remaining<0)
return s;
}
return null;
}
更正式地说:如果
n
是allSongs
中每个Song
对象的numTickets
之和,则对于任何整数0
到n-1
,上述方法应返回列表中的一首歌曲。将返回特定Song
对象x
的整数数量将由x.numTickets
决定。特定歌曲的选择条件是由其numTickets
属性和列表中左侧项目的numTickets
属性共同确定的连续整数范围。目前的方法会在范围外返回null。注意:超出范围的行为可以修改以适应流(而不是返回null)。