package com.easyooo.framework.sharding; import java.util.Collections; import java.util.Comparator; import java.util.List; /** * 首位相连的链表结构 * * @author Killer */ public class RoutingGroupUtil implements Comparator<RoutingGroup>{ private List<RoutingGroup> groups; public RoutingGroupUtil(List<RoutingGroup> groups){ this.groups = groups; } /** * 排序并且按区间值划分 * * @param groups */ public void orderAndRange(){ if(groups == null || groups.size() == 0){ return ; } if(groups.size() == 1){ groups.get(0).setRange(new NumberRange(0, Long.MAX_VALUE)); } // 超过2条路由组按区间值划分 // 必须按照StartId ASC排序 Collections.sort(groups, this); for (int i = 0; i < groups.size(); i++) { RoutingGroup tmp = groups.get(i); Long nextSi = getStartId(i, Direction.NEXT); Long si = getStartId(i, Direction.INPLACE); tmp.setRange( new NumberRange(si, nextSi)); } } private enum Direction{ PREV, NEXT, INPLACE } private Long getStartId(int currentIndex, Direction d){ if(d == Direction.NEXT && groups.size() - 1 == currentIndex){ return Long.MAX_VALUE; } if(d == Direction.PREV && currentIndex == 0){ return Long.MIN_VALUE; } if(d == Direction.INPLACE){ return groups.get(currentIndex).getStartId(); } int num = (d == Direction.NEXT) ? 1 : -1; return groups.get(currentIndex + num).getStartId() - 1; } @Override public int compare(RoutingGroup o1, RoutingGroup o2) { return o1.getStartId().intValue() - o2.getStartId().intValue(); } }