端口号区间合并

配置网络时,经常需要配置端口号,但是从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 + ",");
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值