2014.12.3笔记

java回调机制:

Java中没有像C++这样的函数指针,所以不能将一个函数通过参数传递给另一个函数。因此Java中没有回调函数,但仍然可以有回调的机制。Java是一种纯面向对象的语言,它的回调可以通过面向对象的特性实现。

依然采用Person的例子,用Java实现回调。如下:

ICompare接口:

public interface ICompare {

public int comparable(ICompare obj);

}

Person类:

public class Person implements ICompare {

private int age;

private float height;

private float weight;

public Person(int age, float height, float weight) {

super();

this.age = age;

this.height = height;

this.weight = weight;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public float getHeight() {

return height;

}

public void setHeight(float height) {

this.height = height;

}

public float getWeight() {

return weight;

}

public void setWeight(float weight) {

this.weight = weight;

}

@Override

public int comparable(ICompare obj) {

Person p = (Person)obj;

return this.age - p.age;

}

}

测试:

public class CallBackTest {

public static void Sort(ICompare[] objs) {

int n = objs.length;

for(int i = 0; i < n-1; i ++) {

for(int j = 0; j < n-i-1; j ++) {

if(objs[j].comparable(objs[j + 1]) > 0)

{

ICompare temp = objs[j];

objs[j] = objs[j + 1];

objs[j + 1] = temp;

}

}

}

}

public static void showArray(Person persons[]){

for(int i = 0; i < persons.length; i ++) {

System.out.println("age:" + persons[i].getAge() + "  weight:" + persons[i].getWeight() + "  height:" + persons[i].getWeight());

}

}

/**

* @param args

*/

public static void main(String[] args) {

Person[] persons = new Person[]{

new Person(2, 54.5f, 0.82f),

new Person(31, 74.5f, 1.80f),

new Person(54, 44.5f, 1.59f),

new Person(23, 62.0f, 1.78f),

new Person(16, 45.7f, 1.60f)

};

System.out.println("before sort:");

showArray(persons);

Sort(persons);

System.out.println("after sort:");

showArray(persons);

}

}

java.util.Arrays中的Sort就用到了这种技术,从Java的API中可以看出:

public static void sort(Object[] a)

根据元素的自然顺序,对指定对象数组按升序进行排序。数组中的所有元素都必须实现 Comparable 接口。此外,数组中的所有元素都必须是可相互比较的(也就是说,对于数组中的任何 e1 和 e2 元素而言,e1.compareTo(e2) 不得抛出 ClassCastException)。

回调之编程思想

在软件模块调用中,主要有三种机制:同步调用,异步调用和回调。

同步调用是调用方(A)call被调用方(B)的接口,并等待B处理完给出一个回执后A才继续执行,这期间是“阻塞”的。

异步调用是调用方(A)call被调用方(B)的接口后,不等待B执行完,且B在被调用后会直接回执A。

回调是调用方(A)call被调用方(B)时,B也回调(callback)被调用方,双方互调接口,只不过call动作是由A发起的。

同步调用是最简单的,异步调用一般是在回调的基础上实现的。所以了解“回调”的机制是至关重要的。

/**

* 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

* 样例输入:

* 8 4 4 5 1 6 2 7 3 8

* 样例输出:

* 1 2 3 4

*/

创建大小为k的堆,当容器满时:

1、在k个数中找到最大数,

2、删除容器最大数,然后调整堆;

3、插入一个新数,调整堆;

适合海量数据,时间复杂度O(nlgk)

public List<Integer> getMinList(Integer[] num,int k){

List<Integer> list = new ArrayList<Integer> ();

for(Integer i:num){

list = addInteger(list,i,0,list.size()==0?0:list.size()-1,k);

}

return list;

}

public List<Integer> addInteger(List<Integer> list ,int a,int startIndex,int endIndex,int length){

if(list.size()==0){

list.add(a);

return list;

}

//如果小于最小的插入前面

if(a<=list.get(startIndex)){

list.add(startIndex,a);

if(list.size()>length){

list.remove(list.size()-1);

}

return list;

}

//如果大于最大的插入后面

if(a >= list.get(endIndex)){

list.add((endIndex+1),a);

if(list.size()>length){

list.remove(list.size()-1);

}

return list;

}

//如果位于两者之间,插入

if(list.get(startIndex)<a &&((endIndex -startIndex)==1) && list.get(endIndex)>a){

list.add((startIndex+1),a);

if(list.size()>length){

list.remove(list.size()-1);

}

return list;

}

//如果以上都不执行,二分查找比较插入

int middle;

if((endIndex - startIndex)%2!=0){

middle = (endIndex - startIndex+1)/2;

}else{

middle = (endIndex - startIndex)/2;

}

if(a>list.get(middle)){

return addInteger(list,a,middle,endIndex,length);

}else{

return addInteger(list,a,startIndex,middle,length);

}

}

/**

* @param args

* Administrator

* 2013-4-13 上午10:26:50

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

FindMinKFromN f = new FindMinKFromN();

Integer[] a = {4,5,1,6,2,7,3,8};

List<Integer> list = f.getMinList(a, 4);

for(Integer b:list){

System.out.println(b);

}

}

}

时间: 2024-08-21 11:50:11

2014.12.3笔记的相关文章

易轩网络更新页面————————2014.12.13发布

易轩网络更新页面: 最新更新动态: ★易轩★改软件标题工具—)—)豪华版              出炉! 工具大小:52.0 MB(若大于该大小则视为病毒文件处理) 工具功能:更改你想要更改软件的标题(则运行时的名称) 工具版本:v1.0.0.0 工具是否达标:是 工具是否报毒:暂未测试(若大小一致却依然报毒,请添加信任或关闭杀毒软件) 工具下载地址:http://yunpan.cn/cfxEAPKpPxzfg  提取码 ba30 工具作者:易轩 联系方式:邮箱:[email protecte

【ACOUG】2014.12.27ACOUG年会

祝贺ACOUG~2015 越来越好   刚刚过完2014年圣诞节,就迎来了ACOUG的最后一场沙龙,也作为ACOUG的本年度年会,老朋友相聚大家特别开心,下面来看看当时的场景ACOUG开始啦 ACOUG VP 仇实 me 斑点狗 老盖在演讲ing 老盖and me 乐奕and me 圣诞树很漂亮 Leonarding2014.12.27北京&winter分享技术~成就梦想Blog:www.leonarding.com

写在2014.12.31想说的话

时光总是匆匆,不管你愿不愿意,2014就在今天向我们挥手告别,又到了该写年终总结的时候,这一年是收获的一年,是纠结的一年,也是值得纪念的一年,岁月给我们带来的并不是年龄的增长,更多的是心态的成熟和变化.生活有时会逼迫你,不得不放走机遇,甚至不得不抛弃爱情,不要把别人对自己的放弃,变成自己对自己的放弃,人生的日子都是越过越少,剩下的日子越来越重要,所谓顺其自然,并非代表我们可以不努力,而是努力之后我们有勇气接受成败. 关于工作,这一年似乎敲的代码越来越少,也开始厌烦无聊的重复,一直在寻找一种能够在

LAMP开发之环境搭建(2014.12.7在ubuntu下)

Ubuntu下搭建LAMP环境 前言:学习PHP脚本编程语言之前,必须先搭建并熟悉开发环境,开发环境有很多种,例如LAMP.WAMP.MAMP等.这里我搭建的是LAMP环境,即Linux.Apache.MySQL.PHP环境.网上搭建方法也有很多,但都不是最新的,本搭建时间为2014.12.07. 一.搭建环境 Lenovo Y470 VMWare9.0 Ubuntu 14.04.1 LTS (Trusty Tahr):ubuntu-14.04.1-desktop-i386.iso二.安装软件1

【谜客帝国】第九届老爱原创谜会(2014.12.30)

谜客帝国第九届老爱原创谜会(2014.12.30)主持:瓷       计分:晶莹1.现有十人达标准(字)规.注:双扣2.乱呈能,别下毒(11笔字)理3.难得知错又开口(汉人)吕雉4.高校新生载入校(3字年纪比较词)大一岁5.这些问题都不懂(即物赠)几盘咸菜6.太太在聚餐(3字点心)老婆饼7.独活(期货术语•秋千格)做单8.打的付款,节省消费(即赠物)十二支鲜花9.对林散之有安排(2字植物)桉树10.这图可更新(象声词)叮咚11.“苍天骑士”拍马屁(3字外神话人物•上楼格)阿修罗.注:神官“苍天

2014.12.12笔记

重温进程和线程 进程:是程序任务的执行过程,是动态性的,他是持有资源(共享内存,共享文件)和线程的载体: 线程是系统中最小的执行单位,同一个进程有一个线程,线程和进程可以用班级的例子说明,我们把进程比作是一个班级,那么班级的每一个学生就是线程,学生是班级的最小单元,班级之中学生共用桌椅,板凳,黑板,那么线程是系统中最小的执行单位,同一个进程中有多个线程,线程共享进程的资源. 线程的交互:互斥和同步,来实现线程之间的交流:我们拿班级学生例子来说,学生之间需要协作才能完成一些事情,如打扫卫生,但有时

2014.12.25 jQuery学习笔记

jQuery 事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.术语由事件“触发”(或“激发”)经常会被使用. 通常会把 jQuery 代码放到 <head>部分的事件处理方法中: <html> <head> <script type="text/javascript" src="/jquery/jquery.js"></scrip

2014.12.20 学习总结

2014年12月20日下午 一.进制转换 计算机基础进制:二进制.十进制.八进制.十六进制. (一)二进制→十进制 1.展权相加 步骤:第一步:写“2”. 第二步:标指数,从右向左从0开始依次标记. 第三步:乘系数,一一对应. 第四步:相加. 例:二级制数:11010转十进制. 11010 第一步 2    2    2    2    2 第二步 24    23    22    21    20 第三步 24*1  23*1  22*0  21*1  20*0 第四步 24*1+23*1+

公有云:美酒or毒药?--【软件和信息服务】2014.12

几大国际巨头争相布局,公有云市场变幻莫测,而无论这块市场是美酒还是毒药,他们都在翘首期盼. 随着"双11"的胜利落幕,关于公有云的争论又甚嚣尘上,好像"得公有云者得天下",今天还没有跳入公有云的IT厂商好像都是"痴汉".到底公有云的真实机会在哪里?公有云到底是美酒还是毒药? 自从几大公有云巨头开始布局中国市场,包括亚马逊.微软.阿里巴巴.VMware.IBM,大家似乎就觉得中国公有云看到曙光了.其实,公有云市场远比大家看到的巨头抢滩来得复杂,因为