题目描述:
VLAN是一种对局域网设备进行逻辑划分的技术,为了标识不同的VLAN,引入VLAN ID(1-4094之间的整数)的概念。
定义一个VLAN ID的资源池(下称VLAN资源池),资源池中连续的VLAN用开始VLAN-结束VLAN表示,不连续的用单个整数表示,所有的VLAN用英文逗号连接起来。
现在有一个VLAN资源池,业务需要从资源池中申请一个VLAN,需要你输出从VLAN资源池中移除申请的VLAN后的资源池。
输入描述:
第一行为字符串格式的VLAN资源池,第二行为业务要申请的VLAN,VLAN的取值范围为[1,4094]之间的整数。
输出描述:
从输入VLAN资源池中移除申请的VLAN后字符串格式的VLAN资源池,输出要求满足题目描述中的格式,并且按照VLAN从小到大升序输出。
如果申请的VLAN不在原VLAN资源池内,输出原VLAN资源池升序排序后的字符串即可。
public static void main(String[] args) {
System.out.println("请输入两行VLAN");
Scanner in = new Scanner(System.in);
String vlanResouce = in.nextLine();
String reqVlan = in.nextLine();
//拆分资源
String[] valns = vlanResouce.split(",");
List<Integer> valnList = new ArrayList<>();
for (int i = 0; i < valns.length; i++) {
if (valns[i].contains("-")){
String[] valnArr = valns[i].split("-");
int count = 1;
int beginValn =Integer.parseInt(valnArr[0]);
int endValn =Integer.parseInt(valnArr[1]);
valnList.add(beginValn);
valnList.add(endValn);
while (beginValn+count<endValn) {
valnList.add(beginValn + count);
count++;
}
}else{
valnList.add(Integer.parseInt(valns[i]));
}
}
//排序资源
valnList.sort(Comparator.comparingInt(o -> o));
//剔除资源
Integer req = Integer.parseInt(reqVlan);
valnList.remove(req);
//重新编码资源
int beginIndex = 0;
Integer keepBegin = null;
int endIndex = 1;
int count =0;
while (beginIndex<=endIndex && endIndex<valnList.size()){
Integer beginV = valnList.get(beginIndex);
Integer endV = valnList.get(endIndex);
//不连续输出首个
if (endV != beginV+1 && keepBegin == null){
System.out.print(beginV+",");
beginIndex = endIndex;
endIndex++;
}else{
//开始连续
//记录首次开始连续的位置
keepBegin = beginIndex;
Integer keepBeginV = valnList.get(keepBegin);
while(endIndex <valnList.size()){
Integer nextEndV = valnList.get(endIndex);
if (nextEndV-keepBeginV != endIndex -keepBegin ){
endV = valnList.get(endIndex-1);
System.out.print(keepBeginV+"-"+endV+",");
beginIndex = endIndex;
endIndex++;
keepBegin = null;
break;
}
endIndex++;
}
if (endIndex ==valnList.size()){
Integer nextEndV = valnList.get(endIndex-1);
if (keepBegin ==null){
System.out.print(nextEndV);
}else{
System.out.print(keepBeginV+"-"+nextEndV);
}
break;
}
}
}
}