配置网络时,经常需要配置端口号,但是从UI传进来的端口格式虽然是正确的,但经常出现端口有交叉、或者重复的,为了更加友好,需要写一个函数把这些重复或者交叉的端口号格式化成最简单的形式。
初始条件:
1、输入的端口支持多个,多个端口号之间用英文的逗号“,”分隔。例如:80,88
2、输入的端口支持范围,起始端口跟结束端口用“-”分隔。例如:80-88
3、输入的起始端口号小于结束端口号
4、端口port满足:1 <= port <= 65535
5、用户输入的端口号已经是合法的,无需再做判断,仅需要合并后输出即可
输入描述
输入只有一行,即未合并过的端口号
输出描述
合并端口后输出结果,如果单个端口号可以用区间的形式表示,则优先使用区间;输出结果要按照端口号从小到排列
示例1
输入
6553,1,-655,5-1010,1011,1012
输出
1-1012,6553
示例2
输入
5,4,3,2,100,103
输出
2-5,100-101,103
import java.math.BigDecimal;
import java.util.*;
class Data{
int start;
int end;
}
public class Main {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
List<Data> res = new LinkedList<Data>();
List<Data> datas = new LinkedList<Data>();
String[] input=sc.nextLine().split(",");
for(int i=0;i<input.length;i++){
Data data=new Data();
if(input[i].contains("-")){
String[] tt=input[i].split("-");
data.start=Integer.parseInt(tt[0]);
data.end=Integer.parseInt(tt[1]);
}else{
data.start=Integer.parseInt(input[i]);
data.end=Integer.parseInt(input[i]);
}
datas.add(data);
}
Collections.sort(datas, new Comparator<Data>() {
@Override
public int compare(Data o1, Data o2) {
return o1.start - o2.start;
}
});
Data prev = null;
for (Data item : datas) {
if (prev == null || prev.end < item.start-1) {
res.add(item);
prev = item;
} else if (prev.end < item.end) {
prev.end = item.end;
}
}
int len=res.size();
for(int i=0;i<len;i++){
if(i==len-1){
if(res.get(i).start==res.get(i).end){
System.out.print(res.get(i).start);
}else {
System.out.print(res.get(i).start+"-"+res.get(i).end);
}
}else {
if (res.get(i).start == res.get(i).end) {
System.out.print(res.get(i).start + ",");
} else {
System.out.print(res.get(i).start + "-" + res.get(i).end + ",");
}
}
}
}
}