Java数组中的排序和二分查找

【题目】

建立一个关于日期的类,其中包括日期比较的类,并且重写toString方法。在main函数中创建一个find()方法,利用二分查找的方法找出日期,若有则返回其在数组中的位置,若不存在则给出提示。

                                                                                                                                                                                       

【相关内容】

一、toString方法的重写

toString回反应当前对象的自我描述。

在System.out.print()方法中如果插入的是一个对,就会调用对象中的toString方法。

package testCode123;

class people{
	String name;
	people(String n){
		this.name = n;
	}
}

public class TestCode {
	public static void main(String[] args){
		people p = new people("小明");
		System.out.println(p);
	}
}
输出为 testCode123.people@6f7a29a1

如果在类中重写toString方法 

class people{
	String name;
	people(String n){
		this.name = n;
	}
	 
	public String toString() {
		return "我的名字是:"+name;
	}
}
输出为 我的名字是:小明     所以我们可以通过重写toString方法来实现我们想要的输出。

二、日期的排序(自定义排序的书写)

在冒泡排序的基础上,可以在类中创建cmp()方法来实现日期之间的比较。

顺序为 年份--》月份--》日期

返回不同的值,来判日期之间的大小。若比当前日期大则返回1,若相同返回0,小则返回-1。

public int cmp(Date a){
	return year>a.year ? 1
		:year < a.year ? -1
		:month > a.month ? 1
		:month < a.month ? -1
		:day > a.day ? -1
		:day < a.day ? 1  
		: 0;
}
三、二分查找

二分查找建立在一个有序序列上,每次查找序列的中间值进行比较,并更新左右位置的数值。

middle = left + ( right - left) / 2

                                                                                                                                                                                    


代码:

package testCode123;

class Date{
	int year;
	int month;
	int day;
	
	Date(int y,int m,int d){
		this.year=y;this.month=m;this.day=d;
	}
	
	public int cmp(Date a){
		return year>a.year ? 1
				:year < a.year ? -1
				:month > a.month ? 1
				:month < a.month ? -1
				:day > a.day ? -1
				:day < a.day ? 1  
				: 0;
	}
	
	public String toString(){
		return year  + "年" + month + "月" + 
				day + "日";
	}
}

public class TestDateSort {
	
	public static void main(String[] args){
		
		Date[] days = new Date[10];
		days[0] = new Date(2006, 5, 4);
		days[1] = new Date(2006, 7, 4);
		days[2] = new Date(2008, 5 ,4);
		days[3] = new Date(2004, 5, 9);
		days[4] = new Date(2004 ,5, 4);
		days[5] = new Date(2005 ,2,18);
		days[6] = new Date(2007, 10,29);
		days[7] = new Date(2002,11,28);
		days[8] = new Date(2010,6,3);
		days[9] = new Date(2007,1,6);
		
		bubbleSort(days);
		
		for(int i = 0; i < days.length ; i++ ){
			/*
			System.out.println(days[i].year  + "年" + days[i].month + "月" + 
				days[i].day + "日");
			*/
			System.out.println(days[i]); //当我们直接打印一个对象的时候,我们调用其中的toString方法
		}
		
		Date test1 = new Date(2010,6,3);
		
		int l = find(test1,days);
		if(l==-1)
			System.out.println("未找到当前日期!!!");
		else
			System.out.println(l);
	}
	
	public static Date[] bubbleSort(Date[] a){
		int len = a.length;
		for(int i = 0; i < len; i++){
			for(int j = 0 ;j<i;j++){
				if(a[j].cmp(a[i])>0){ //返回值去和0进行比较,大于零说明a[j]要比a[i]大    所以大的就要往后走
					Date z;
					z = a[i];
					a[i] = a[j];
					a[j] = z;
				}
			}
		}
		return a;
	}
	
	public static int find(Date obj,Date[] cal){
		int location= 0;
		
		int left,right,middle;
		left = 0;
		right = cal.length-1;
		
		while(left <= right){
			middle = left + (right - left)/2;
			if(obj.cmp(cal[middle])==0)
			{
				location = middle;
				return location;
			}
			else if(obj.cmp(cal[middle])>0){
				left = middle + 1;
			}else{
				right = middle - 1;
			}
			//System.out.println(left + " "  +right +" "+ middle);
		}
		return -1;
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值