0%

在使用Dubbo过滤器时候,我们可以借鉴Dubbo过滤器的实现方式来设计一个类似与Dubbo过滤器的模式的实现方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public class FilterDemo {

static interface Invoker {
void invoke();
}

static interface Filter {
void invoke(Invoker invoker);
}

static class FilterA implements Filter {

@Override
public void invoke(Invoker invoker) {
System.out.println("filter a before invoker do invoke");
invoker.invoke();
System.out.println("filter a after invoker do invoke");
}
}

static class FilterB implements Filter {
@Override
public void invoke(Invoker invoker) {
System.out.println("filter b before invoker do invoke");
invoker.invoke();
System.out.println("filter b after invoker do invoke");
}
}

public static void main(String[] args) {
List<Filter> filterList = new ArrayList<>();
Filter filterA = new FilterA();
Filter filterB = new FilterB();

filterList.add(filterA);
filterList.add(filterB);

Invoker last = new Invoker() {
@Override
public void invoke() {
System.out.println("invoker do action");
}
};

for (int i = filterList.size() - 1; i >= 0; i--) {
Filter filter = filterList.get(i);
Invoker next = last;
last = new Invoker() {
@Override
public void invoke() {
filter.invoke(next);
}
};
}

last.invoke();
}
}

执行结果:

1
2
3
4
5
filter a before invoker do invoke
filter b before invoker do invoke
invoker do action
filter b after invoker do invoke
filter a after invoker do invoke

堆定义

从简单的二叉堆定义:在二叉堆的数组中,每个元素都要保证大于等于另外两个特定位置的元素。这些位置的元素又至少大于等于数组中的另外两个元素。

在堆有序的二叉树中,每个结点都要小于等于它的父结点,从任意结点向上,我们都能得到一列非递减的元素;从任意结点向下,我们都能得到一列非递增的元素。

如果用数组表示的话,在一个堆中,位置为k的结点的父亲结点位置为k/2,而它的两个子结点位置分别为2k和2k+1。

同样由二叉堆启发,我们可以构造出三叉堆,乃至多叉堆。

堆的算法

堆底插入元素时,要由下至上恢复堆的顺序,堆上浮
1
2
3
4
5
6
private void swim(int k) {
while(k > 1 && less(k/2, k)) {
exch(k/2, k);
k = k/2;
}
}
某结点替换为一个元素,需要由上至下恢复堆,堆下沉
1
2
3
4
5
6
7
8
9
private void sink(int k) {
while(2*k < n) {
int j = 2*k;
if (j < n && less(j, j+1)) j++;
if (!less(k, j)) break;
exch(k,j);
k = j;
}
}
构造堆,堆下沉法(也可以用扫描所有元素来进行堆上浮)
1
2
3
4
5
6
public static void make(Comparable[] a) {
int N = a.length;
for(int k=N/2; k>=1, k--) {
sink(a, k ,N);
}
}
堆排序
1
2
3
4
5
6
7
8
9
10
11
public static void make(Comparable[] a) {
int N = a.length;
for(int k=N/2; k>=1, k--) {
sink(a, k ,N);
}

while(N > 1) {
exch(a, 1, N--);//最大元素和最后一个元素兑换
sink(a, 1, N);//调整堆顺序,根结点最大
}
}
应用
  • 实现基于堆的优先队列
  • 堆排序

Jetbrains全系列产品2020.1及以下版本(理论上适用于目前所有新老版本)最新注册服务器(License Server)的破解,可使用它来激活你手头上的Jetbrains IDE,具体支持产品和版本见下文的列表。

传送门:
百度云下载(baidu pan),提取码(password):uum9。
具体使用方法已写在压缩包的 README.pdf / README.txt内。
(要个毛的readme,直接把jetbrains-agent-latest.zip拖进IDE就行了)
本站下载的包中都是带有important.txt的,缺失这个文件会不定时有弹框出现,请注意看弹框内容。

仅供学习参考,如需购买正版!

终于用Hexo + Gitpages成功搭建了自己的博客系统。本来很简单的事情折腾好久,原来仅仅是因为GitHub的gitpages仓库默认名称要和自己的用户一致,否则打开一直是一个Hello World页面。

从今往后可以在自己的空间里写博客了,博客的内容也很简单,就是记录自己生活中一些有趣的事情和值得留念的事情;再就是记录和总结一些技术点。时间长了,自己能够知道最近自己做了什么?技术有没有提高等等。没事自己用文字立一些Flag,隔一段时间自己来检查自己有没有达成目标。总之,写博客这个Flag今天立下了,那么就开始写啦!

最后送自己一句话,贵在坚持!