合并线段 java

e.g. [0, 1] [1, 4] [4, 5] [5, 8] [2, 6] [3, 10]  -> [0, 1] [1, 10]

逻辑判断的是前开后开的,不过这个改起来很方便

没有在传入的链表里直接操作,新建了个链表。每加入一个线段,在新链表里面过一遍,判断要删掉和合并的部分。

java里面迭代的时候不能操作链表了,遍历完之后整体删除和插入,每次必插入一条。

打印了下每个循环的过程。

public class LineMerge {

    public static void main(String[] args) {
        Integer[] l1 = new Integer[]{0,1};
        Integer[] l2 = new Integer[]{1,4};
        Integer[] l3 = new Integer[]{4,5};
        Integer[] l4 = new Integer[]{5,8};
        Integer[] l5 = new Integer[]{2,6};
        Integer[] l6 = new Integer[]{3,10};

        List<Integer[]> list = new ArrayList<>();
        list.add(l1);
        list.add(l2);
        list.add(l3);
        list.add(l4);
        list.add(l5);
        list.add(l6);

        lineMerge(list);

    }


    /**
     *
     * @param pointlists
     * @return
     */
    public static List<Integer[]> lineMerge(List<Integer[]> pointlists){
        List<Integer[]> lineSplitPoints = new ArrayList<Integer[]>();

        for(Integer[] line: pointlists){
            int start = line[0];
            int end = line[1];
            //线段有交叠的部分 就需要删除  重新定义线段长度
            //每次循环必然会重新插入数据
            System.out.println("import1 = " + Arrays.deepToString(line));
            Iterator<Integer[]> it = lineSplitPoints.iterator();
            List<Integer[]> removelist = new ArrayList<Integer[]>();
            while (it.hasNext()){
                Integer[] cur = it.next();
                if(line[0] < cur[1] && line[1] > cur[0]){
                    start = Math.min(start,cur[0]);
                    end = Math.max(end,cur[1]);
                    System.out.println("remove = " + Arrays.toString(cur));
                    //迭代器好像不能直接remove
                    removelist.add(cur);
                    //it.remove();
                }
            }
            lineSplitPoints.removeAll(removelist);
            lineSplitPoints.add(new Integer[]{start,end});

            for(Integer[] i : lineSplitPoints){
                System.out.print(Arrays.deepToString(i));
            }
            System.out.println();

        }
        return lineSplitPoints;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值