输入参数:已占用的端口数组、生成返回的个数,端口区间大小
核心代码如下:
public static void main(String[] args) throws Exception {
List<Integer> ids= new ArrayList<Integer>();
// ids.add(6001);
// ids.add(6002);
// ids.add(6006);
Collections.sort(ids);
Long a = System.currentTimeMillis();
System.out.println(findNextPort(ids,3,6000,7000));
System.out.println(System.currentTimeMillis()-a);
}
//计算缺失的端口
public static List<Integer> findNextPort(List<Integer> numbers, int count,int min,int max) {
List<Integer> newList = new ArrayList<>();
//将现有数加入BitSet
BitSet bitSet = new BitSet(numbers.size());
for (Integer number : numbers) {
bitSet.set(number);
}
int len= max-min;
double step=0;
if(len>0&&count>0) {
step=Math.floor(len/count);
}
boolean random=false;
//遍历查找
for (int i = min; i <= max; i++) {
if (!bitSet.get(i)) {
//默认开始填充数组
if(newList.size()==0&&!random&&step>count) {
random=true;
i = new Random().nextInt(max - min + 1) + min - count- 1;
continue;
}else {
newList.add(i);
}
}
if(newList.size()>=count) {
break;
}
}
return newList;
}