更改自levitated.net的FLASH TAGS CLOUD(1)

By19.Published on四月 22, 2010 16:30. 14 Views .
很差差一般好非常好 (1 次评分, 平均: 4.00 out of 5)
Loading ... Loading ...

续我上次以Levitated.net的源码为基础,修改并发表了一篇WP的TAGS墙~之后,这次又以其提供的开源小应用修改了两个FLASH的标签云。本来连改了好几个效果,不过最后就两个合适的。分两篇文章发布,分开发布原因是两个标签云放在一个页面性能上有问题……

Levitated.net上的源码离现在已经很多年了,时间虽然长,不过他提供的算法还是值得我们借鉴。此次提供的两个标签云都可以进行例如字体颜色及背景颜色的配置(通过参数),标签云FLASH的宽和高可以随意设置,生成的标签完全自适应显示。

另一个效果,这个效果我觉得才是真正的有云的感觉http://www.ll19.com/levitated-flash-tags-cloud.html

FLASH通过读取XML进行标签显示,下面为XML的格式:

1
2
3
4
5
< ?xml version="1.0" encoding="UTF-8"?>
<root>
	<tags><name>java</name><link>java</link></tags>
	<tags><name>as3</name><link>as3</link></tags>
</root>

XML地址通过传入xmlUrl参数的值设置,例如此FLASH传入的地址为(http://www.ll19.com/wp-content/plugins/19_tags_cloud/19tags.php),下面为具体的引用:

1
2
3
4
5
<object id="rssReader" type="application/x-shockwave-flash" data="http://www.ll19.com/wp-content/plugins/19_tags_cloud/dropinletters.swf" width="100%" height="100%">
	<param name="movie" value="http://www.ll19.com/wp-content/plugins/19_tags_cloud/dropinletters.swf" />
	<param name="wmode" value="transparent" />
	<param name="FlashVars" value="xmlUrl=http://www.ll19.com/wp-content/plugins/19_tags_cloud/19tags.php">
</param></object>

如果是WordPress顺便提供一个简单的WP TAGS XML生成程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
include_once ('../../../wp-config.php');
global $wpdb;
$sql = "SELECT wtt.term_id as id,count,name,slug FROM $wpdb->term_taxonomy AS wtt , $wpdb->terms AS wt where wtt.term_id = wt.term_id and taxonomy = 'post_tag' ORDER BY count DESC LIMIT 0 , 100 ";
$content = $wpdb->get_results($sql);
echo "< ?xml version=\"1.0\" encoding=\"UTF-8\"?>";
echo "<root>";
global $tags_19;
foreach ($content as $tags_19)
	: echo "<tags>";
echo "<name>";
echo $tags_19->name;
echo "</name>";
echo "<link>";
echo $tags_19->slug;
echo "</link>";
echo "</tags>";
endforeach;
echo "</root>";

点击了标签后会跳转到相关链接,这里跳转链接的操作不是从FLASH中直接打开,而是通过调用页面的JS函数(tagsCall)来打开相关页面,即点击了tags节点中的name标签会传回link的值供JS(tagsCall)调用。下面是JS例子:

1
2
3
4
5
6
7
8
9
<script type="text/javascript">
function tagsCall(tagLink) {
	var url = "http://www.ll19.com/tag/" + tagLink;
	win = window.open(url, "_blank");
	if (!win) {
		window.open(url, "_self");
	}
}
</script>

这样做就是为了不要搞的只是打开链接那么死板,也许有别的事情可做,所以你在使用过程中只要按照XML的格式生成TAGS的节点后将这个地址以xmlUrl传入FLASH,再写一个tagsCall的JS函数进行相关操作就OK了。

此标签云一些其他的相关配置:

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
//XML
public static var xmlUrl : String = "../../xml/tag.xml";
 
//影片质量
public static var quality : String = "low";
 
//是否显示FPS
public static var fps : Boolean = false; 
 
//主背景颜色
public static var backgroundColor : uint = 0x000000;
 
//FPS的颜色和字体
public static var fpsTextColor : uint = 0xFFFFFF;
public static var fpsTextFace : String = "Georgia";
 
//字体
public static var textFace : String = "黑体";
public static var textSize : Number = 20;
public static var textColor : uint = 0xFFFFFF;
public static var textShadowColor : uint = 0xEEEEEE;
 
//字符间距
public static var letterSpacing : Number = 20;
 
//定时器时间
public static var intervalDuration : Number = 800;

可以通过传入与静态变量名相同的参数值来配置标签云的显示或运行效果,例如-这是一个配置了不同背景及字体颜色的效果(如下传入了backgroundColor和textColor的值),具体的不同颜色的演示效果http://www.ll19.com/up/19_tags_cloud/dropinletters.html

1
2
<param name="FlashVars" value="xmlUrl=http://www.ll19.com/wp-content/plugins/19_tags_cloud/19tags.php&backgroundColor=0xffffff&textColor=0x000000">
</param>

源码下载地址:

http://code.google.com/p/glll/downloads/detail?name=19_tags_cloud.7z

具体效果如下:

继续阅读…Continue reading…

{ 0 comments } { Tags: , , }

做了一道Java逻辑题

By19.Published on四月 16, 2010 17:14. 11 Views .
很差差一般好非常好 (1 次评分, 平均: 5.00 out of 5)
Loading ... Loading ...

题目:有一种体育竞赛共含M个项目,有运动员A,B,C参加,在每一项目中,第一,第二,第三名分别的X,Y,Z分,其中X,Y,Z为正整数且X>Y>Z。最后A得22分,B与C均得9分,B在百米赛中取得第一。求M的值,并问在跳高中谁得第二名。

没有过于分析条件,一个大致的过滤。所谓的逻辑题似乎用程序便成了“取得所有组合、遍历”,无太多逻辑可言。代码如下:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
package com.ll19.test.subject;
import java.util.ArrayList;
public class S1 {
	/**
	 * 有一种体育竞赛共含M个项目, 有运动员A,B,C参加, 在每一项目中, 第一,第二,第三名分别的X,Y,Z分, 其中X,Y,Z
	 * 为正整数且X>Y>Z。 最后A得22分,B与C均得9分,B在百米赛中取得第一。求M的值,并问在跳高中谁得第二名。
	 * 
	 * @author <a href="http://www.LL19.com/">LL19.com</a>
	 */
 
	// m个项目 起码有两个或以上的项目
	private int m = 0;
 
	// abc三人可能名次的全部组合
	private static ArrayList<string> rankList = new ArrayList</string><string>();
 
	// m个项目所有可能的名次组合
	private static ArrayList</string><string> pRankList = new ArrayList</string><string>();
 
	// 所有可能的一二三名分数组合(起码有两个或以上的项目 、B得过第一、X小于等于8(9-1) 大于等于3)
	private static ArrayList</string><string> pointList = new ArrayList</string><string>();
 
	// 运动员a b c
	private String a = "a";
	private String b = "b";
	private String c = "c";
 
	// 最后得分
	private int aPoint = 22;
	private int bPoint = 9, cPoint = 9;
 
	public static void main(String[] args) {
		// PS:命名S1时并未想到曰本著名会社
		long begin = System.currentTimeMillis();
		S1 s1 = new S1();
		s1.loop();
		System.out.println("执行时间:" + (System.currentTimeMillis() - begin)
				+ "毫秒");
	}
 
	/**
	 * 
	 * 得到abc三人可能名次的全部组合
	 */
	public S1() {
		// abc三人可能名次的全部组合
		ArrayList</string><string> personList = new ArrayList</string><string>();
		personList.add(a);
		personList.add(b);
		personList.add(c);
		combination(new StringBuffer(""), personList, personList.size(), false,
				rankList, "");
		// System.out.println(rankList);
		// 可能的一二三名分数组合
		// B得过第一、X起码小于等于8(9-1)
		ArrayList</string><string> tmpPointList = new ArrayList</string><string>();
		tmpPointList.add("8");
		tmpPointList.add("7");
		tmpPointList.add("6");
		tmpPointList.add("5");
		tmpPointList.add("4");
		tmpPointList.add("3");
		tmpPointList.add("2");
		tmpPointList.add("1");
		combination(new StringBuffer(""), tmpPointList, 3, false, pointList, "");
		filterPointList();
		checkPoint();
		// System.out.println(pointList);
	}
 
	/**
	 * 循环
	 */
	public void loop() {
		// 几个随意的遍历的条件(没有仔细揣摩 = =):
		// M起码有两个或以上的项目
		// ABC三人总分40
		// B得过第一、B的总分为9、X起码小于等于8(9-1)
		// X>Y>Z x大于等于3 前三名最少分数是 3+2+1=6
		// 则M最大为6(根据总分40和前三名最小分数和6得到)
		for (int i = 2; i < = 6; i++) {
			m = i;
			// 过滤M m(x+y+z) = 40 为了减少循环次数
			if (checkM()) {
				// System.out.println(m);
				pRankList.clear();
				combination(new StringBuffer(""), rankList, m, true, pRankList,
						";");
				checkB();
				// System.out.println(pRankList);
				for (int j = 0; j < pRankList.size(); j++) {
					for (int k = 0; k < pointList.size(); k++) {
						if (points(pointList.get(k)) * m == 40) {
							if (checkABC(pRankList.get(j), pointList.get(k))) {
								System.out.println("项目数:" + m);
								System.out.println("名次:" + pRankList.get(j));
								System.out.println("每个项目的分数:"
										+ pointList.get(k));
							}
						}
					}
				}
			}
		}
	}
 
	/**
	 * 最后A得22分,B与C均得9分
	 */
	private boolean checkABC(String rank, String point) {
		String ranks[] = rank.split(";");
		char xyz[] = point.toCharArray();
		int counta = 0;
		int countb = 0;
		int countc = 0;
		for (int i = 0; i < ranks.length; i++) {
			char abc[] = ranks[i].toCharArray();
			for (int j = 0; j < abc.length; j++) {
				if (String.valueOf(abc[j]).equals("a")) {
					counta += Integer.valueOf(String.valueOf(xyz[j]));
				} else if (String.valueOf(abc[j]).equals("b")) {
					countb += Integer.valueOf(String.valueOf(xyz[j]));
				} else if (String.valueOf(abc[j]).equals("c")) {
					countc += Integer.valueOf(String.valueOf(xyz[j]));
				}
			}
		}
		if (counta == aPoint && countb == bPoint && countc == cPoint) {
			return true;
		} else {
			return false;
		}
	}
 
	/**
	 * 过滤M m(x+y+z) = 40 和分数队列的所有匹配 返回可能的符合条件
	 */
	private boolean checkM() {
		boolean b = false;
		for (int i = 0; i < pointList.size(); i++) {
			// 40分判断
			String point = pointList.get(i);
			int count = points(point);
			if (m * count == 40) {
				b = true;
				break;
			}
		}
		return b;
	}
 
	/**
	 * B得过第一
	 */
	private void checkB() {
		ArrayList<String> tmp = new ArrayList</string><string>();
		for (int j = 0; j < pRankList.size(); j++) {
			String ranks[] = pRankList.get(j).split(";");
			boolean b = false;
			for (int i = 0; i < ranks.length; i++) {
				if (ranks[i].startsWith("b")) {
					b = true;
				}
			}
			if (b) {
				tmp.add(pRankList.get(j));
			}
		}
		pRankList = tmp;
	}
 
	/**
	 * 对分数队列进行过滤 删除不符合条件的分数组合
	 * 
	 * X>Y>Z x大于等于3
	 */
	private void filterPointList() {
		ArrayList</string><string> tmpList = new ArrayList</string><string>();
		for (int i = 0; i < pointList.size(); i++) {
			int pX = Integer.valueOf(String.valueOf((pointList.get(i)
					.toCharArray()[0])));
			int pY = Integer.valueOf(String.valueOf((pointList.get(i)
					.toCharArray()[1])));
			int pZ = Integer.valueOf(String.valueOf((pointList.get(i)
					.toCharArray()[2])));
			if (pX < 3 || pZ > pY || pZ > pX || pY > pX) {
 
			} else {
				tmpList.add(pointList.get(i));
			}
		}
		pointList = tmpList;
	}
 
	/**
	 * ABC三人总分40 分数加起来应该能被40整除
	 */
	private void checkPoint() {
		ArrayList</string><string> tmp = new ArrayList</string><string>();
		for (int i = 0; i < pointList.size(); i++) {
			// 40分判断
			String point = pointList.get(i);
			int count = points(point);
			if (40 % count == 0) {
				tmp.add(pointList.get(i));
			} else {
			}
		}
		pointList = tmp;
	}
 
	/**
	 * 
	 * 求和
	 */
	private int points(String point) {
		char[] c = point.toCharArray();
		int count = 0;
		for (int j = 0; j < c.length; j++) {
			count += Integer.valueOf(String.valueOf(c[j]));
		}
		return count;
	}
 
	/**
	 * 递规方法 算出每个种类的对应组合
	 * 
	 * @param repeat
	 *            是否允许重复
	 * @param separator
	 *            遍历每个结果的分割符
	 */
	public void combination(StringBuffer str, ArrayList<String> list,
			int length, boolean repeat, ArrayList</string><string> addList,
			String separator) {
		if (length == 1) {
			for (int i = 0; i < list.size(); i++) {
				StringBuffer result = new StringBuffer(str);
				String tmpStr = list.get(i);
				result.append(tmpStr + separator);
				// 加入队列
				addList.add(result.toString());
			}
		}
		if (length > 1) {
			for (int i = 0; i < list.size(); i++) {
				StringBuffer temp = new StringBuffer(str);
				String tmpStr = list.get(i);
				ArrayList<String> listTmp = new ArrayList</string><string>(list);
				if (!repeat) {
					listTmp.remove(i);
				}
				combination(temp.append(tmpStr + separator), listTmp,
						length - 1, repeat, addList, separator);
			}
		}
	}
 
}
</string>

继续阅读…Continue reading…

{ 0 comments } { Tags: }