線分データの数え上げ(続きの続き)

前の記事はこちら
今、N個のデータが得られるとする。そのデータは、1次元尺度上の線分に相当するデータであるものとする。簡単に言えば、aiからbiまでというようなデータが、N個得られるとする。このようなデータから、ある値xについて、[tex:ai<=c

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		double[][] data ={
				{2,5},
				{4,6},
				{5,9},
				{1,3}
		};

		double[][] list = segprob(data);
		for(int i=0;i<list.length;i++){
			System.out.println(list[i][0]+"\t"+list[i][1]);
		}
	}

	public static double[][] segprob(double[][] d){
		double[][] ret = new double[d.length*2][2];
		double[][] list = new double[d.length*2][2];
		int counter=0;
		for(int i=0;i<d.length;i++){
			list[counter][0]=d[i][0];
			list[counter][1]=1;
			list[counter+1][0]=d[i][1];
			list[counter+1][1]=-1;
			counter+=2;
		}
		for(int i=0;i<list.length;i++){
			for(int j=0;j<list[i].length;j++){
				System.out.print(list[i][j]+"\t");
			}
			System.out.println();
		}
		int N=0;
		double[][] sortedlist = StatUtilsY.MiscUtilX.bublSortListsByColNo2X(list, N);
		
		for(int i=0;i<sortedlist.length;i++){
			ret[i][0]=sortedlist[i][0];
			if(i==0){
				ret[i][1]=sortedlist[i][1];
				
			}else{
				
				ret[i][1]=ret[i-1][1]+sortedlist[i][1];
			}
		}
		int counter2=0;
		double[][] ret2=new double[ret.length][ret[0].length];
		for(int i=0;i<ret.length;i++){
			if(i==0){
				ret2[0][0]=ret[0][0];
				ret2[0][1]=ret[0][1];
			}else{
				if(ret[i][0]==ret[i-1][0]){
					ret2[counter2][0]=ret[i][0];
					ret2[counter2][1]=ret[i][1];
				}else{
					counter2++;
					ret2[counter2][0]=ret[i][0];
					ret2[counter2][1]=ret[i][1];
				}
			}
		}
		//return sortedlist;
		//System.out.println("counter2="+counter2);
		double[][] ret3=new double[counter2+1][2];
		for(int i=0;i<ret3.length;i++){
			for(int j=0;j<ret3[i].length;j++){
				ret3[i][j]=ret2[i][j];
			}
		}
		return ret3;
	}
public static double[][] bublSortListsByColNo2X(double[][] p, int N){
		double[] listTobeSorted=new double[p.length];
		for(int i=0;i<p.length;i++){
			listTobeSorted[i]=p[i][N];
		}
		for(int i=0;i<listTobeSorted.length;i++){
			System.out.println(listTobeSorted[i]);
		}
		int[] order = bublSortRetInt(listTobeSorted);
		double[][] ret = new double[p.length][p[0].length];
		for(int i=0;i<ret.length;i++){
			System.out.println(order[i]);
			for(int j=0;j<ret[i].length;j++){
				ret[order[i]][j]=p[i][j];
			}
		}
		return ret;
	}
	public static int[] bublSortRetInt(double[] p){
		double[] copyP = DeepCopyDouble1(p);
		int[] ret = new int[p.length];
		for(int i=0;i<ret.length;i++){
			ret[i]=i;
		}
		boolean flag=true;
		boolean sameflag=false;
		for(int i=copyP.length-1;i>=0;i--){
			for(int j=1;j<=i;j++){
				if(copyP[j-1]==copyP[j]){
					sameflag=true;
					//ret = 0;
					//return ret;
				}
				if(copyP[j-1]>copyP[j]){
					double tmp = copyP[j-1];
					int tmpint = ret[j-1];
					copyP[j-1]=copyP[j];
					ret[j-1]=ret[j];
					copyP[j]=tmp;
					ret[j]=tmpint;
					//ret+=1;
					if(flag){
						flag=false;
					}else{
						flag=true;
					}
				}
			}
		}
		/*
		for(int i=0;i<copyP.length;i++){
			System.out.println(copyP[i]);
			System.out.println(ret[i]);
		}
		*/
		int[] ret2 = new int[ret.length];
		for(int i=0;i<ret.length;i++){
			ret2[ret[i]] = i;
		}
		return ret2;
	}