博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

计算与所有线段都重合的线段数目

Posted on 2012-09-11 12:40  钟悍  阅读(372)  评论(0编辑  收藏  举报
package com.karl.util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class TestOverlap {

    private static List<Duration> getDurations() {
        Duration d1 = new Duration(new Node(4L, true), new Node(5L, false));
        Duration d2 = new Duration(new Node(1L, true), new Node(3L, false));
        Duration d3 = new Duration(new Node(2L, true), new Node(3L, false));
        Duration d4 = new Duration(new Node(2L, true), new Node(4L, false));
        Duration d5 = new Duration(new Node(1L, true), new Node(4L, false));
        List<Duration> list = new ArrayList<Duration>();
        list.add(d1);
        list.add(d2);
        list.add(d3);
        list.add(d4);
        list.add(d5);
        return list;
    }

    private static List<Node> getNodes() {
        List<Duration> durations = getDurations();
        List<Node> nodes = new ArrayList<Node>();
        for (Duration d : durations) {
            nodes.add(d.getStart());
            nodes.add(d.getEnd());
        }
        return nodes;
    }

    private static int getOverlap(Duration d) {
        int max = 1;
        int current = 1;
        List<Node> nodes = getNodes();
        Collections.sort(nodes);
        Iterator<Node> it = nodes.iterator();
        while (it.hasNext()) {
            Node node = it.next();
            System.out.println(node);
            if ((node.getValue() >= d.getStart().getValue())
                    && (node.getValue() <= d.getEnd().getValue())) {
                if (node.isStart()) {
                    current++;
                } else {
                    current--;
                }
                if (current > max) {
                    max = current;
                }
            }
        }
        return max;
    }

    public static void main(String[] args) {
        Duration d = new Duration(new Node(0L, true), new Node(9L, false));
        System.out.println(getOverlap(d));
    }

}

class Duration {
    private Node start;
    private Node end;

    public Node getStart() {
        return start;
    }

    public void setStart(Node start) {
        this.start = start;
    }

    public Node getEnd() {
        return end;
    }

    public void setEnd(Node end) {
        this.end = end;
    }

    public Duration(Node start, Node end) {
        this.start = start;
        this.end = end;
    }

}

class Node implements Comparable<Node> {
    private Long value;
    private boolean start;// this flag indicate the start point or the destination point.

    public Node(Long value, boolean start) {
        this.value = value;
        this.start = start;
    }

    public Long getValue() {
        return value;
    }

    public void setValue(Long value) {
        this.value = value;
    }

    public boolean isStart() {
        return start;
    }

    public void setStart(boolean start) {
        this.start = start;
    }

    @Override
    public String toString() {
        return "[" + value + "," + start + "]";
    }

    @Override
    public int compareTo(Node o) {
        return Long.valueOf(this.value).compareTo(Long.valueOf(o.value));
    }

}