快速业务通道

java api接口篇(二)上 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
的解决方案。多重映射(Multimaps)一个multimap与一个map类似, 只是它可以将每个键映射为多个值。Collections Framework不包括多重映射接口,因为它们不是很普遍地被使用。将一个其值为List对象的Map当作多重映射来使用则是相当简单的事情。这个技术在下一个代码举例中将被演示,这个例子是阅读每行(全部小写)一个单词的一部词典并打印所有满足尺寸标准的permutation groups(排列组)。一个排列组是一组单词,它们包含完全相同的字母,但字母顺序不同。这个程序在命令行中使用了两个参数:词典文件名和要打印的排列组的尺寸;排列组包含的单词如果少于指定的最小值,则该排列组不被打印。

有一个查找排列组的标准技巧:将词典中的每个词的字母按字母顺序进行排列(即将一个词的字母按字母顺序记录下来)并将一个项放入一个多重映射,将经过字母排序的单词映射到原来的单词。例如,单词"bad" 导致一个项映射 "abd" 至 "bad" 被放入多重映射。一个瞬间的反射将显示任何给定的键映射到所有单词形成一个排列组。在一个多重映射中迭代键以及打印满足尺寸条件的每一个排列组是一个简单的事情。

下列程序是这个技术的一个直接的实现。仅有的技巧部分是alphabetize方法,它返回一个串,这个串包含与它的参数相同的字符,并按字母顺序排列。这个例程(它与Collections Framework无关) 实现一个巧妙的桶式分类。它假定按字母顺序排列的单词完全由小写字母组成。

import java.util.*; import java.io.*; public class Perm { public static void main(String[] args) { int minGroupSize = Integer.parseInt(args[1]); // Read words from file and put into simulated multimap Map m = new HashMap(); try { BufferedReader in = new BufferedReader(new FileReader(args[0])); String word; while((word = in.readLine()) != null) { String alpha = alphabetize(word); List l = (List) m.get(alpha); if (l==null) m.put(alpha, l=new ArrayList()); l.add(word); } } catch(IOException e) { System.err.println(e); System.exit(1); } // Print all permutation groups above size threshold for (Iterator i = m.values().iterator(); i.hasNext(); ) { List l = (List) i.next(); if (l.size() $#@62; = minGroupSize) System.out.println(l.size() + ": " + l); } } private static String alphabetize(String s) { int count[] = new int[256]; int len = s.length(); for (int i=0; i$#@60; len; i++) count[s.charAt(i)]++; StringBuffer result = new StringBuffer(len); for (char c="a"; c$#@60; ="z"; c++) for (int i=0; i$#@60; count[c]; i++) result.append(c); return result.toString(); } }

java api接口篇(二)上(5)

时间:2010-12-24

在一台老式UltraSparc 1上运行一个有80,000个单词的词典用了大约16秒;最小排列组尺寸为8 。它生成了下列输出

% java Perm dictionary.txt 8 9: [estrin, inerts, insert, inters, niters, nitres, sinter, triens, trines] 8: [carets, cartes, caster, caters, crates, reacts, recast, traces] 9: [capers, crapes, escarp, pacers, parsec, recaps, scrape, secpar, spacer] 8: [ates, east, eats, etas, sate, seat, seta, teas] 12: [apers, apres, asper, pares, parse, pears, prase, presa, rapes, reaps, spare, spear] 9: [anestri, antsier, nastier, ratines, retains, retinas, retsina, stainer, stearin] 10: [least, setal, slate, stale, steal, stela, taels, tales,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号