@@ -32,7 +32,7 @@ private class SkipNode
3232 internal struct SkipNodeLevel
3333 {
3434 /// <summary>
35- /// 前一个结点
35+ /// 下一个结点
3636 /// </summary>
3737 internal SkipNode Forward ;
3838
@@ -337,7 +337,7 @@ public TElement[] ToArray()
337337 {
338338 var elements = new TElement [ Count ] ;
339339 var node = header . Level [ 0 ] ;
340- int i = 0 ;
340+ var i = 0 ;
341341 while ( node . Forward != null )
342342 {
343343 elements [ i ++ ] = node . Forward . Element ;
@@ -489,19 +489,23 @@ public int GetRangeCount(TScore start, TScore end)
489489 rank += cursor . Level [ i ] . Span ;
490490 cursor = cursor . Level [ i ] . Forward ;
491491 }
492- if ( bakCursor == null )
492+
493+ if ( bakCursor != null )
493494 {
494- bakCursor = cursor ;
495- bakRank = rank ;
495+ continue ;
496496 }
497+
498+ bakCursor = cursor ;
499+ bakRank = rank ;
497500 }
498501
499- if ( ! isRight )
502+ if ( isRight )
500503 {
501- cursor = bakCursor ;
502- rank ^= bakRank ^= rank ^= bakRank ;
504+ continue ;
503505 }
504506
507+ cursor = bakCursor ;
508+ rank ^= bakRank ^= rank ^= bakRank ;
505509 } while ( isRight = ! isRight ) ;
506510
507511 return Math . Max ( 0 , rank - bakRank ) ;
@@ -713,7 +717,7 @@ public TElement GetElementByRank(int rank)
713717 {
714718 rank = Math . Max ( 0 , rank ) ;
715719 rank += 1 ;
716- int traversed = 0 ;
720+ var traversed = 0 ;
717721 var cursor = header ;
718722 for ( var i = level - 1 ; i >= 0 ; i -- )
719723 {
@@ -723,15 +727,18 @@ public TElement GetElementByRank(int rank)
723727 traversed += cursor . Level [ i ] . Span ;
724728 cursor = cursor . Level [ i ] . Forward ;
725729 }
730+
726731 if ( traversed == rank )
727732 {
728733 return cursor . Element ;
729734 }
730735 }
736+
731737 if ( Count > 0 )
732738 {
733739 throw new ArgumentOutOfRangeException ( "Rank is out of range [" + rank + "]" ) ;
734740 }
741+
735742 throw new InvalidOperationException ( "SortSet is Null" ) ;
736743 }
737744
@@ -869,9 +876,7 @@ private bool Remove(TElement element, TScore score)
869876 //从跳跃层高到低的进行查找
870877 for ( var i = level - 1 ; i >= 0 ; -- i )
871878 {
872- while ( cursor . Level [ i ] . Forward != null &&
873- ( Compare ( cursor . Level [ i ] . Forward . Score , score ) <= 0 &&
874- ! cursor . Level [ i ] . Forward . Element . Equals ( element ) ) )
879+ while ( IsFindNext ( cursor . Level [ i ] . Forward , element , score , i ) )
875880 {
876881 cursor = cursor . Level [ i ] . Forward ;
877882 }
@@ -902,27 +907,64 @@ private bool Remove(TElement element, TScore score)
902907 /// <returns>排名,排名以0为底</returns>
903908 private int GetRank ( TElement element , TScore score )
904909 {
905- int rank = 0 ;
910+ var rank = 0 ;
906911 var cursor = header ;
907912 for ( var i = level - 1 ; i >= 0 ; -- i )
908913 {
909- while ( cursor . Level [ i ] . Forward != null &&
910- ( Compare ( cursor . Level [ i ] . Forward . Score , score ) <= 0 &&
911- ! cursor . Level [ i ] . Forward . Equals ( element ) ) )
914+ while ( IsFindNext ( cursor . Level [ i ] . Forward , element , score , i ) )
912915 {
913916 rank += cursor . Level [ i ] . Span ;
914917 cursor = cursor . Level [ i ] . Forward ;
915918 }
916- if ( cursor != header &&
917- cursor . Element != null &&
918- cursor . Element . Equals ( element ) )
919- {
920- return rank - 1 ;
921- }
922919 }
920+
921+ cursor = cursor . Level [ 0 ] . Forward ;
922+
923+ if ( cursor != null && cursor != header &&
924+ cursor . Element != null &&
925+ cursor . Element . Equals ( element ) )
926+ {
927+ return rank ;
928+ }
929+
923930 return - 1 ;
924931 }
925932
933+ /// <summary>
934+ /// 是否查询下一个元素
935+ /// </summary>
936+ /// <param name="node">跳跃结点</param>
937+ /// <param name="element">元素</param>
938+ /// <param name="score">分数</param>
939+ /// <param name="level">层级</param>
940+ /// <returns>是否查找下一个</returns>
941+ private bool IsFindNext ( SkipNode node , TElement element , TScore score , int level )
942+ {
943+ if ( node == null )
944+ {
945+ return false ;
946+ }
947+
948+ var compare = Compare ( node . Score , score ) ;
949+ if ( compare < 0 || compare > 0 )
950+ {
951+ return compare < 0 ;
952+ }
953+
954+ // 如果层级大于0,说明有可能直接定位到元素2,从而导致bug
955+ // 所以我们认为层级大于 0 那么值相等依旧返回前序跳跃结点
956+ //
957+ // ------------------------------------------
958+ // | 元素1(分数:50) | 元素2 (分数:50)
959+ // ------------------------------------------
960+ if ( level > 0 )
961+ {
962+ return false ;
963+ }
964+
965+ return ! node . Element . Equals ( element ) ;
966+ }
967+
926968 /// <summary>
927969 /// 删除结点关系
928970 /// </summary>
0 commit comments