线段的内部查找

题目介绍:

定义线段:


//线段,表示起点和终点
public class Segment {
      int start;
      int end;
      public Segment(int start,int end)
      {
          this.start=start;
          this.end=end;
      }
}
题目:

//假设两个list有序,且线段不相交,即后一个segment的start大于前一个segment的end。p判断前一个list是否包含后一个list
        List<Segment> l1=new ArrayList<Segment>();
        List<Segment> l2=new ArrayList<Segment>();

代码:

import java.util.ArrayList;
import java.util.List;


public class SegmentDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //假设两个list有序,且线段不相交,即后一个segment的start大于前一个segment的end。p判断前一个list是否包含后一个list
        List<Segment> l1=new ArrayList<Segment>();
        List<Segment> l2=new ArrayList<Segment>();
        l1.add(new Segment(1, 3));
        l1.add(new Segment(5, 10));
        l2.add(new Segment(5, 6));
        l2.add(new Segment(7, 11));
        SegmentContain seContain=new SegmentContain();
        if(seContain.segcontains(l1, l2))
            System.out.println("true");
        else
            System.out.println("false");
                

    }

}


import java.util.List;

import javax.imageio.stream.IIOByteBuffer;


public class SegmentContain {
     public boolean segcontains(List<Segment> l1,List<Segment> l2)
     {
         int i=0;
         int j=0;
         int leng1=l1.size();
         int leng2=l2.size();
         int number=0;
         for(;i<leng1 && j<leng2;)
         {
             int value=isequal(l1.get(i),l2.get(j));
             if(value==0)
             {j++;number++;}
             else if (value<0)
             {
                 i++;
             }
             else {
                j++;
                number++;
            }
         }
         if(number==leng2)
             return true;
         else {
            return false;
        }
        
     }
     
     private int isequal(Segment s1,Segment s2)
     {
         if(s1.start>s2.start)
         {
             return -1;
         }
         else {
            if(s1.start==s2.start)
            {
                if(s1.end==s2.end)    //线段相等,返回0,i,j均相加
                    return 0;
                else if (s1.end<s2.end)  //
                {
                    return -1;
                }
                else
                {
                    return 0;
                    
                }
            }
            else {
                if(s1.end==s2.end)
                    return 0;
                else if (s1.end<s2.end)
                {
                    return -1;
                    
                }
                else {
                    return 1;       //线段包含,返回1,表示list2向后平移
                }
            }
        }
     }
}



转载于:https://my.oschina.net/ashan2012/blog/212065

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值