关于bidimap+java的信息
本篇文章给大家谈谈bidimap+java,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、JAVA中commons-collections-3.2.1.jar包是干什么用的
- 2、JAVA中commons-collections-3.2.1.jar包是干什么用的?
- 3、JAVA中如何让HashMap中的value与一个变量比较
- 4、花火read在哪写文
- 5、Apache Commons 工具类介绍及使用方法简单说明
JAVA中commons-collections-3.2.1.jar包是干什么用的
1.commons-collections 包的功能
为Java标准的Collections API提供了相当好的补充。在此基础上对其常用的数据结构操作进行了很好的封装、抽象和补充。保证性能的同时大大简化代码。
2.commons-collections 包的分类:
根据集合类型,大致将此包的类归纳为9类:
Bag -- 在org.apache.commons.collections包中定义的接口,它extends java.util.Collection,而它的实现类都被放在下面的bag包中。HashBag是Bag接口的一个标准实现。而BagUtils提供一组static的方法让调用者获取经过不同装饰后的Bag实例.具体用法见代码样例
Buffer -- 定义在org.apache.commons.collections包下面的接口,用于表示按一定顺序除去成员对象的collection如队列等。具体的实现类在org.apache.commons.collections.buffer 包下可以找到。最简单直接的Buffer实现类是UnboundedFifoBuffer,提供先进先出的大小可变的队列。而BoundedFifoBuffer则是对其大小进行了限制,是固定大小的先进先出队列。BlockingBuffer要在多线程的环境中才能体现出它的价值,尤其是当我们需要实现某种流水线时这个BlockingBuffer很有用:每个流水线上的组件从上游的BlockingBuffer获取数据,处理后放到下一个BlockingBuffer中依次传递。BlockingBuffer的核心特色通俗点说就是如果你向它要东西,而它暂时还没有的话,你可以一直等待直至拿到为止。PriorityBuffer则提供比一般的先进先出Buffer更强的控制力:我们可以自定义Comparator给它,告诉它怎么判定它的成员的先后顺序,优先级最高的最先走。此外还有执行类型检查的TypedBuffer、或者不可改变的UnmodifiableBuffer等等
Map -- 在java.util.Map的基础上扩展的接口和类。BidiMap,直译就是双向Map,可以通过key找到value,也可以通过value找到key,这在我们日常的代码-名称匹配的时候很方便:因为我们除了需要通过代码找到名称之外,往往也需要处理用户输入的名称,然后获取其代码。需要注意的是BidiMap当中不光key不能重复,value也不可以。MultiMap,就是说一个key不在是简单的指向一个对象,而是一组对象,add()和remove()的时候跟普通的Map无异,只是在get()时返回一个Collection,利用MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多。LazyMap,意思就是这个Map中的键/值对一开始并不存在,当被调用到时才创建。
Collection -- 用也各collection之间的类型转换。典型的是TypedCollection,它实际上的作用就是提供一个decorate方法,我们传进去一个Collection和需要的类型甄别信息java.lang.Class,它给我们创建一个全新的强类型的Collection。(暂无样例代码,以后补充)
Comparator -- 提供了一些Comparator的实现类(都在org.apache.commons.collections.comparators包下面)BooleanComparator – 用于排序一组Boolean对象,指明先true还是先false;ComparableComparator – 用于排序实现了java.lang.Comparable接口的对象(我们常用的Java类如String、Integer、Date、Double、File、Character等等都实现了Comparable接口);ComparatorChain – 定义一组Comparator链,链中的Comparator对象会被依次执行;FixedOrderComparator – 用于定义一个特殊的顺序,对一组对象按照这样的自定义顺序进行排序;NullComparator – 让null值也可参与比较,可以设定为先null或者后null;
ReverseComparator – 将原有的Comparator效果反转;TransformingComparator – 将一个Comparator装饰为具有Transformer效果的Comparator。
Predicate -- 它以一个Object对象为参数,处理后返回一个boolean值,检验某个对象是否满足某个条件。Commons Collections也提供了一组定义好的Predicate类供我们使用,这些类都放在org.apache.commons.collections.functors包中。当然,我们也可以自定义Predicate,只要实现这个Predicate接口即可。
Transformer -- 我们有时候需要将某个对象转换成另一个对象供另一组方法调用,而这两类对象的类型有可能并不是出于同一个继承体系的,或者说出了很基本的Object之外没有共同的父类,或者我们根本不关心他们是不是有其他继承关系,甚至就是同一个类的实例只是对我们而言无所谓,我们为了它能够被后续的调用者有意义的识别和处理,在这样的情形,我们就可以利用Transformer。除了基本的转型Transformer之外,Commons Collections还提供了Transformer链和带条件的Transformer,使得我们很方便的组装出有意义的转型逻辑。
Closure -- 这一组接口和类提供一个操作对象的execute方法,为我们在处理一系列对象时可以将处理逻辑分离出来。ChainedClosure可以包装一组Closure作为整体执行;IfClosure在创建时需要提供给它一个Predicate和两个Closure,执行时先做Predicate判定再决定执行哪一个Closure;SwitchClosure跟SwitchTransformer类似,根据创建时传入的Predicate组和Closure组对应执行;WhileClosure则根据创建时传入的Predicate做判断,如果为true则执行Closure,直到Predicate返回false;等等。
Iterator -- java.util.Iterator接口定义了标准的Collection遍历方法,但是如果不做改变的使用它,我们得到的是从头到尾一次性的遍历。假如我们需要循环遍历,假如我们需要遍历某一段,假如我们需要遍历满足某些条件的元素,等等等等,我们就不能完全依赖于这个Iterator的标准实现了。除非我们宁可在此基础上在调用的代码中多加一些判断,不过这样的话代码就会显得混乱,时间长了就容易变得难以维护。Commons Collections的这一组Iterator为我们带来了便利。
JAVA中commons-collections-3.2.1.jar包是干什么用的?
Commons项目组中的一个各种集合类和集合工具类的封装
Commons-Collections seek to build upon the JDK classes by providing new interfaces, implementations and utilities.There are many features, including:Bag interface for collections that have a number of copies of each objectBuffer interface for collections that have a well defined removal order, like FIFOsBidiMap interface for maps that can be looked up from value to key as well and key to valueMapIterator interface to provide simple and quick iteration over mapsType checking decorators to ensure that only instances of a certain type can be addedTransforming decorators that alter each object as it is added to the collectionComposite collections that make multiple collections look like oneOrdered maps and sets that retain the order elements are added in, including an LRU based mapIdentity map that compares objects based on their identity (==) instead of the equals methodReference map that allows keys and/or values to be garbage collected under close controlMany comparator implementationsMany iterator implementationsAdapter classes from array and enumerations to collectionsUtilities to test or create typical set-theory properties of collections such as union, intersection, and closure类似C++中的Boost库,对Java容器类型和算法的补充
JAVA中如何让HashMap中的value与一个变量比较
使用if(map.containsValue(id)) 可以直接测得是否含有该元素值,但不能返回键值
我还是用遍历返回键值,使用Java 5以上的语法
String id="name";
HashMapString,String map=new HashMapString, String();
map.put("k1","v1");
map.put("k2","name");
map.put("k3","v3");
for(Map.EntryString, String e: map.entrySet()){
if(e.getValue().equals(id)){
System.out.println("找到键:"+e.getKey()+" 和值:"+e.getValue());
break;
}
}
=========
输出
找到键:k2 和值:name
==================
使用第三方提供的双关联图BidiMap可能更高效,
但最高效的还是从根本上避免这种查找需求。。
花火read在哪写文
可根据需求导入对应的jar。
一、HWPFDocument类的使用 用HWPFDocument类将数据写到指定的word文档中,基本思路是这样的: - 首先,建立一个HWPFDocument类的实例,关联到一个临时的word文档; - 然后,通过Range类实例,将数据写入这个word文档中; - 接着,将这个临时的word文档通过write函数写入指定的word文档中。 - 最后,关闭所有资源。 下面详细说明各个步骤。 1.构造函数 这里要说明一下,经过试验,暂时还没找到直接在程序中新建一个word文档并读取的方法,只能先创建好temp.doc,然后在程序中读取。(用File-createNewFile和POIFSFileSystem.create创建出来的.doc文件,都不能被正确读取) 另外,其实选择哪种参数传入都是一样的,毕竟HWPFDocument关联的word文档是无法写入的,只是当作一个临时文件。所以,选择最为熟悉的InputStream较为合适。 参数1:InputStream。可将word文档用FileInputStream流读取,然后传入HWPFDocument类。主要用于读取word文档中的数据。 参数2:POIFSFileSystem。POIFSFileSystem的构造函数参数可以是(File,boolean)【这样的话file必须是已经存在的】,后者为false时可读写。这里可以写为
HWPFDocument doc = new HWPFDocument(new POIFSFileSystem(new File("temp.doc"),false));
2.Range类 (1)获取Range类实例。 HWPFDocument类中有一系列获取Range类实例以操作word文档的方法。比较常用的是getRange(),这个方法可以获取涵盖整个文档的范围,但不包括任何页眉和页脚。
Range range = doc.getRange();
此外,还有获取所有文本范围的getOverallRange()、获取所有文本框的getMainTextboxRange()等等,具体可以根据需求查阅文档。
(2)Range类操作word文档 Range类中有大量获取文档数据的方法,若有需要可以查阅文档。这里只说明与写入数据有关的方法。 1. insertBefore(String),将字符串插入到此range的开头。返回值类型:CharacterRun 2. insertAfter(String),将字符串插入到此range的结尾。返回值类型:CharacterRun 3. insertTableBefore(short列数, int行数),在此range的开头插入一个指定行列数的表。返回值类型:Table 4. text(),获取当前range的所有文本。返回值类型:String。虽然不是写入数据的方法,但是在调试过程中比较好用。
3.write方法 HWPFDocument类中的write方法有三种重载形式:(实际上可以理解为writeTo) 参数1:空参数。将本对象关联的word文档写入另一个打开的可写的POIFSFileSystem文件中。 参数2:File。将本对象关联的word文档写入指定的文件(newFile)中。如果该文件不存在,则创建;若存在,则覆盖。 参数3:OutputStream。将本对象关联的word文档写入指定的字节输出流中。 可以根据需求选择,但是最好还是选择OutputStream,因为输出流的操作空间更大。参数2的newFile不能续写,只能覆盖。 可以将其直接写入目标文件的输出流,也可以先写入一个字节数组输出流,在通过字节数组输出流写入到目标文件输出流中。
4.关闭资源 - 关闭doc.close();,也即是关闭doc所使用的资源”temp.doc” - 关闭将数据写入指定word文档的输出流
二、代码示例
复制代码
三、调试记录 1.关于创建临时temp.doc的尝试 目的:在程序开始时创建一个temp.doc,程序结束后删除。
尝试1:用File-createNewFile创建出文件,然后用POIFSFileSystem构造函数打开这个文件, 然后用HWPFDocument关联到这个POIFSFileSystem类实例。 结果:org.apache.poi.EmptyFileException: The supplied file was empty (zero bytes long)。创建出的文件是0字节空文件,不能被POIFSFileSystem打开。
尝试2:用POIFSFileSystem.create(file)静态函数创建POIFSFileSystem实例,然后用 HWPFDocument关联。 结果:java.io.FileNotFoundException: no such entry: “WordDocument”, had: []。文件 是创建成功了,也用POIFSFileSystem成功载入,但是HWPFDocument无法接收这个参数。
结论:目前只能用Office软件创建的word文档才行。也就是说暂时还没找到直接在程序中新建 一个word文档的方法,只能先创建好temp.doc,然后在程序中读取。
2.无法写入temp.doc
描述:用doc.getRange()方法获取文件的整个范围,然后用range.insertAfter(String)方法 插入数据。编译运行没有任何异常,但是打开文件发现还是原样。
尝试:插入数据后用range.text()获取当前range的所有文本并显示在控制台上,发现数据的 确是成功插入到了range中,但是temp.doc依然没有任何变化。
猜测:可能是文件读取到HWPFDocument的方式不对,只读不可写入。 也有可能是range中的内容并不会改变.doc的内容,必须doc.write(*)写入到另一个文件中才 行。 尝试:通过各种方式(inputstream,poifsfilesystem,(poifs,readonly))载入temp.doc,结 果都是一样。于是开始尝试第二种猜测。
3.加入doc.write(*)方法后,运行报错,找不到需要的类文件(编译正常)。 详情:只加了这一句话,这句话报错:doc.write(out):java.lang.NoClassDefFoundError错 误 分析:NoClassDefFoundError发生在编译时对应的类可用,而运行时在Java的classpath路径 中,对应的类不可用导致的错误。 解决:要注意看报错的提示: Exception in thread “main” java.lang.NoClassDefFoundError: org/apache/commons/collections4/bidimap/TreeBidiMap…… 可以看出,是org.apache.commons.collections4包找不到导致的。导入这个包即可。 收获:使用外部jar包时,并不是只把所有代码里用到的类所在的jar包导入就万事大吉了,经 常是代码中用到的类里需要用到其他包中的类。如果在运行时报错,要注意看报错提示,根据 提示导入相关的包。 就这样一个简答的小bug卡了我半天,以后代码出错时不要只看错误类型,一定要细看报错的 描述。
4.无法写入目标文件 详情:续2,通过doc.write(out)方法将数据写到字节输出流,目标文件毫无变化。
尝试:用doc.write方法将数据写到字节数组,看看数据是否真的被输出了(如果是,就说明 是数据写入目标文件的过程中出了问题,而不是doc.write输出的问题) 结果:在输出的内容中找到了想要输出的数据。由此说明,前面的一切都没问题了,问题出在 把数据写入word文档上。
尝试:将目标文件删除,让程序创建出一个。结果,写入成功。那么问题来了:
5.目标文件无法续写 详情:由程序自己创建出的word文档可以写入,但已存在的word文档无法续写。即使是程序自 己创建出的word文档,也只能写入一次,无法续写。
分析:Range输出的数据是带有word文档的创建信息和格式数据的,这些内容对于已存在的 word文档不适用。 现在的情况是:用于创建HWPFDocument对象的temp.doc必须手动创建;目标文件必须由代码生 成,且生成后只能用代码写入一次。 将数据写入指定word文档的流程是:用getRange()方法获得临时文件数据(其实是为了获取 word文档的创建信息、格式数据),然后将源文件数据写入range,最后将range写入目标文件 的字节输出流。 既然如此,为何不直接将临时文件的来源设为目标文件呢?这样getRange所获取的range就能 同时包含目标文件中的原有文本数据,再在其后添加源文件中的内容,然后将整个range写入 由代码新创建的目标文件,不就是另一种意义上的续写吗?这样既避免了手动创建temp.doc, 又能实现续写,还能让避免产生垃圾文件(无意义的temp.doc)
解决:考虑到输入输出的冲突问题,先将目标文件重命名为temp.doc,然后由程序新创建出一 个空的目标文件。如果需要续写,就直接用getRange方法获取原来的所有数据;如果不需要续 写,就用Range(0,0,tempdoc)获取一个空的range,只带有格式和创建信息。将所有源数据写 入range后,用temp.write(out)将range中的数据写入新创建的目标文件。
6.如何不续写? 思路:由传入的参数,如果不续写,就用range.replaceText(“”,false),将整个range清空, 然后再往后插入需要的内容。
问题2:做了上述操作后,仍然是续写,原range并没有清空。 分析:经过一系列测试,发现原因:用程序写入的文本,用range.text()读取不到,当然用 range.replaceText也无法操作了。而在程序写入后,随便手动在文件中写点东西然后保存, 再用range.text()就可以读取到了。
结论:这可能是包的固有bug之二,暂时无法解决。
四、其他 其实,poi包对于word文档来说,主要功能还是读取,写入功能很初级、不完善。poi只能操作最简单的word格式内容,当要求的样式复杂、文档长度较长时,用poi就较难完成要求。 这时,Jacob是一个更好的选择。Jacob能完整保持复杂的格式内容,操作也更为方便。但Jacob也有个缺点:只能在Windows平台下实现,无法在linux平台下实现。 此外,要生成标准格式的word文档,还有一种思路,是在另一篇博客上看到的:
先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。
Apache Commons 工具类介绍及使用方法简单说明
Apache Commons 工具类大家都有用过,但是可能缺乏系统学习,只用到了一小部分功能,无法发挥极限的价值,我用大白话说就是,一颗好白菜都让猪给拱了!
代码过多,手机观看效果不佳,建议收藏后在电脑上静悄悄地看。因内容 健康 ,可大胆转发,即使未满十八岁,在没有家长陪同下也一样可以观看!
提供了对于JavaBean进行各种操作, 比如对象,属性复制等等。
XML与Java对象之间相互转换。
提供了一些公共的编解码实现,比如Base64, Hex, MD5,Phonetic and URLs等等。
对java.util的扩展封装,处理数据还是挺灵活的。
org.apache.commons.collections – Commons Collections自定义的一组公用的接口和工具类
org.apache.commons.collections.bag – 实现Bag接口的一组类
org.apache.commons.collections.bidimap – 实现BidiMap系列接口的一组类
org.apache.commons.collections.buffer – 实现Buffer接口的一组类
org.apache.commons.collections.collection – 实现java.util.Collection接口的一组类
org.apache.commons.collections.comparators – 实现java.util.Comparator接口的一组类
org.apache.commons.collections.functors – Commons Collections自定义的一组功能类
org.apache.commons.collections.iterators – 实现java.util.Iterator接口的一组类
org.apache.commons.collections.keyvalue – 实现集合和键/值映射相关的一组类
org.apache.commons.collections.list – 实现java.util.List接口的一组类
org.apache.commons.collections.map – 实现Map系列接口的一组类
org.apache.commons.collections.set – 实现Set系列接口的一组类
commons compress中的打包、压缩类库。
用来帮助处理配置文件的,支持很多种存储方式。
1. Properties files
2. XML documents
3. Property list files (.plist)
4. JNDI
5. JDBC Datasource
6. System properties
7. Applet parameters
8. Servlet parameters
(Database Connection Pool)是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。
Apache组织提供的一个资源JDBC工具类库,它是对JDBC的简单封装,对传统操作数据库的类进行二次封装,可以把结果集转化成List。,同时也不影响程序的性能。
DbUtils类:启动类
ResultSetHandler接口:转换类型接口
MapListHandler类:实现类,把记录转化成List
BeanListHandler类:实现类,把记录转化成List,使记录为JavaBean类型的对象
Qrery Runner类:执行SQL语句的类
提供的一个开源的API,是对javamail的封装。
基于HttpCore实 现的一个HTTP/1.1兼容的HTTP客户端,它提供了一系列可重用的客户端身份验证、HTTP状态保持、HTTP连接管理module。
对java.io的扩展 操作文件非常方便。
主要是一些公共的工具集合,比如对字符、数组的操作等等。
提供的是一个Java 的日志接口,同时兼顾轻量级和不依赖于具体的日志实现工具。
通用验证系统,该组件提供了客户端和服务器端的数据验证框架。
1.验证日期
2.表达式验证
3.配置文件中使用验证
4.验证类
bidimap+java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、bidimap+java的信息别忘了在本站进行查找喔。
发布于:2022-12-04,除非注明,否则均为
原创文章,转载请注明出处。