>>No.51592322
呃呃,上次发的有点问题,没说明白。说白了就是跳转到回复页(;´Д`)
正确的应该(中括号内的内容为添加的内容):
发言→[我希望]我的回复点击后直接跳转到指定页,而不是上次页(比如我在2页回复,上次在11页退出,那么点击后[应该]跳转到2页而不是11页)
不过这好像需要服务器的api支持|д` )
因为蓝岛无论在哪回复,都是回到上次退出的位置(有时候只回到父串,甚至到不了指定位置),所以提出了这个建议。最近想出一种没有api的解决办法
以下是解决代码(java)(没写判空,懒( ̄3 ̄),本人技艺不精,再加上用手机写的没测试,可能有bug,请大佬谅解)(json包用的json-java,其他的应该差不多):
@param pfId 父串id
@param pageCount 父串的总页数
@param userId 回复时的user_hash
@param rtime 回复时的时间戳(精确到秒)
@return 第几页(索引0对应值)的第几个(索引1对应值)消息,可以配合接口获取父串,然后再通过蓝岛本身实现跳转到第几个,-1代表不存在
public static int[] getReplyLocation(int pfId,int pageCount,String userId,long rtime){
int page = pageCount/2;
do{
JSONObject pf = getpf(pfId,page);
JSONArray replies = pf.getJSONArray("replies");
JSONObject head = replies.getJSONObject(0);
Date firstTime = formatT(head.getString("now"));
JSONObject last = replies.getJSONObject(replies.size()-1);
Date lastTime = formatT(end.getString("now"));
Date rTime = new Date(rtime);
if(rTime.after(lastTime)){
//回复时间在该页最后的时间以后
page += page/2;
}else if(firstTime.after(rTime)){
//该页最早的时间在回复时间以后,即回复时间比该页最早的时间还早
page -= page/2;
}else{
//回复时间在该页回复内
//todo 这里也可以用二分法查找,但是懒得写了
for(int i;i<replies.size();++i){
JSONObject reply = replies.getJSONObject(i);
if(userId.equal(reply.getString("user_hash")&&rtime==formatT.getTime(reply.getString("now"))))) return new int[]{page,i};//这里也可以改为匹配串id,更快,但是我懒得改了
}
}
}while(page<pageCount);
return new int[]{-1,-1};
}
public static Date formatT(String backTime){
//为什么X岛不直接返回时间戳,非得是可视化时间,搞得还得转换一步( ̄皿 ̄)
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date d;
try {
d = df.parse(backTime.replaceAll("(.+)"," "));
} catch (ParseException e) {
//todo 解决异常的代码
}
return d;
}
public static JSONObject getpf(int pfId,int page){
//todo 通过串id获取串内容的方法,还是懒得写
}
这种方法只需要log2^n次请求,非常的节省服务器资源,而且可以用其他查找方法,实现更少的请求
希望能加入此功能(*゚∀゚*)
Version: 0.23.2.24.a1b3
Device: HONOR RNA-AN00 OS: 12(31)