
标准的Map访问方法如下:
Set keys = mapkeySet( );
if(keys != null) {
Iterator iterator = keysiterator( );
while(iteratorhasNext( )) {
Object key = iteratornext( );
Object value = mapget(key);
;
;}
}
然后,这个方法有一个问题。从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的。
幸运的是,这里有一个更加简单的途径。Map类提供了一个称为entrySet()的方法,这个方法返回一个MapEntry实例化后的对象集。
接着,MapEntry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。举例如下:
Set entries = mapentrySet( );
if(entries != null) {
Iterator iterator = entriesiterator( );
while(iteratorhasNext( )) {
MapEntry entry =iteratornext( );
Object key = entrygetKey( );
Object value = entrygetValue();
;
}
}
尽管增加了一行代码,我们却省略了许多对Map不必要的逗get地调用。同时,提供给开发人员一个同时保持了关键字和其对应的值的类。MapEntry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。
Hashtable内部排列的方式是散列排布,所以当输出信息时会是无序的。为了能保证输出的数据按照顺序排列,不要渴望用java自带的函数来对
Hashtable对象进行调整处理。当我们获取Hashtable里的KEY和VALUE时,一般都运行了MapEntry类来转换,好,现在就用这
个类来作文章,我具体写了一个方法。
代码:
/
方法名称:getSortedHashtable
参数:Hashtable h 引入被处理的散列表
描述:将引入的hashtableentrySet进行排序,并返回
/
public static MapEntry[] getSortedHashtable(Hashtable h){
Set set = hentrySet();
MapEntry[] entries = (MapEntry[])settoArray(new MapEntry[setsize()]);
Arrayssort(entries,new Comparator(){
public int compare(Object arg0, Object arg1) {
Object key1 = ((MapEntry)arg0)getKey();
Object key2 = ((MapEntry)arg1)getKey();
return ((Comparable)key1)compareTo(key2);
}
});
return entries;
}
调用这个方法:
MapEntry[] set = getSortedHashtable(t);
//perportyTable
for (int i=0;i<setlength;i++){
Systemoutprintln(set[i]getKey()toString());
Systemoutprintln(set[i]getValue()toString());
}
你的方法中用了递归,所以要注意变量的恰当使用。
Map<String,
String>
strMap
=
new
HashMap<String,
String>();这句只要出现递归情况都会执行一次,这样strMap
就会不断引用到新建的HashMap,有一种情况,如果递归遍历中出现的最后一次是一个文件夹并且这个文件夹是空的,那么strMap引用到的HashMap(strMap
=
new
HashMap<String,
String>();)就会是空的,
package comxjjutil;
import javautilHashSet;
import javautilList;
import javautilMap;
import javautilRandom;
import javautilSet;
/
随机数工具,单例模式
@author XuJijun
/
public class RandomUtils {
private static Random random;
//双重校验锁获取一个Random单例
public static Random getRandom() {
if(random==null){
synchronized (RandomUtilsclass) {
if(random==null){
random =new Random();
}
}
}
return random;
}
/
获得一个[0,max)之间的整数。
@param max
@return
/
public static int getRandomInt(int max) {
return Mathabs(getRandom()nextInt())%max;
}
/
获得一个[0,max)之间的整数。
@param max
@return
/
public static long getRandomLong(long max) {
return Mathabs(getRandom()nextInt())%max;
}
/
从list中随机取得一个元素
@param list
@return
/
public static <e> E getRandomElement(List<e> list){
return listget(getRandomInt(listsize()));
}
/
从set中随机取得一个元素
@param set
@return
/
public static <e> E getRandomElement(Set<e> set){
int rn = getRandomInt(setsize());
int i = 0;
for (E e : set) {
if(i==rn){
return e;
}
i++;
}
return null;
}
/
从map中随机取得一个key
@param map
@return
/
public static <k, v=""> K getRandomKeyFromMap(Map<k, v=""> map) {
int rn = getRandomInt(mapsize());
int i = 0;
for (K key : mapkeySet()) {
if(i==rn){
return key;
}
i++;
}
return null;
}
/
从map中随机取得一个value
@param map
@return
/
public static <k, v=""> V getRandomValueFromMap(Map<k, v=""> map) {
int rn = getRandomInt(mapsize());
int i = 0;
for (V value : mapvalues()) {
if(i==rn){
return value;
}
i++;
}
return null;
}
public static void main(String[] args) {
Set<string> set = new HashSet<>();
for (int i = 0; i < 12; i++) {
setadd(I am: + i);
}
for (int i = 0; i < 10; i++) {
Systemoutprintln(getRandomElement(set));
}
}
}
</string></k,></k,></k,></k,></e></e></e></e>
众所周知,mybatis的传入参数可以是各种Java的基本数据类型:包含int,String,Date等。基本数据类型作为传参,只能传入一个。通过#{参数名} 即可获取传入的值 ,复杂数据类型:包含JAVA实体类、Map。通过#{属性名}或#{map的KeyName}即可获取传入的值,但是如果想传入一个collection怎么办呢?
经查找后发现可以使用mapper配置文件中的foreach语句,借用别人写的文章:
37 foreach
对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。List 实例将使用“list”做为键,数组实例以“array” 做为键。
foreach元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素是很智能的,它不会偶然地附加多余的分隔符。
注意:你可以传递一个List实例或者数组作为参数对象传给MyBatis。当你这么做的时候,MyBatis会自动将它包装在一个Map中,用名称在作为键。List实例将会以“list”作为键,而数组实例将会以“array”作为键。
这个部分是对关于XML配置文件和XML映射文件的而讨论的。下一部分将详细讨论Java API,所以你可以得到你已经创建的最有效的映射。
371参数为array示例的写法略372参数为list示例的写法
接口的方法声明:
Java代码
public List getStudentListByClassIds_foreach_list(List classIdList);
动态SQL语句:
Xml代码
<!-- 72 foreach(循环List参数) - 作为where中in的条件 -->
SELECT STSTUDENT_ID,
STSTUDENT_NAME,
STSTUDENT_SEX,
STSTUDENT_BIRTHDAY,
STSTUDENT_PHOTO,
STCLASS_ID,
STPLACE_ID
FROM STUDENT_TBL ST
WHERE STCLASS_ID IN
#{classIdList}
测试代码,查询学生中,在20000001、20000002这两个班级的学生:
Java代码
@Test
public void test7_2_foreach() {
ArrayList classIdList = new ArrayList();
classIdListadd("20000001");
classIdListadd("20000002");
List list = thisdynamicSqlMappergetStudentListByClassIds_foreach_list(classIdList);
for (StudentEntity e : list) {
Systemoutprintln(etoString());
}
}
这个是ItEye上的一篇文章,其中配置文件中的parameterType是可以不配置的,mybatis会自动传入的。当您想传入collection时,并不能直接传入collection对象,要将其先转换为list,然后才能传入。因为mybatis生成SQL语句遍历list时是需要用到get()方法的,而这个方法只在List中才有,Collection里是没有的。以上的配置在Mybitis官方文档中的“动态SQL”也可以找到。
参数示例:
根据班级ID查询教师列表
xml文件
[html] view plaincopy
select from Teacher where c_id=#{id}
java代码
[java] view plaincopy
List tList = teacherMapperselectTeacher(2);
for (Teacher entityTemp : tList) {
Systemoutprintln(entityTemptoString());
}
JAVA实体类型参数示例:
[html] view plaincopy
select from Teacher where c_id=#{id}
[java] view plaincopy
java代码
Teacher queryTeacher=new Teacher();
queryTeachersetId(2);
List tList = teacherMapperselectTeacher(queryTeacher);
for (Teacher entityTemp : tList) {
Systemoutprintln(entityTemptoString()); }
Map参数示例:
[html] view plaincopy
select from Teacher where c_id=#{id} and sex=#{sex}
[java] view plaincopy
java代码
Map map=new HasMap();
mapput("id","2");
mapput("sex","男");
List tList = teacherMapperselectTeacher(map);
for (Teacher entityTemp : tList) {
Systemoutprintln(entityTemptoString()); }
另外MyBatis还提供了一个使用注解来参入多个参数的方式。这种方式需要在接口的参数上添加@Param注解
示例:
接口方法
[java] view plaincopy
public List selectTeacher(@Param(value="id") String id,@Param(value="sex") String sex);
XML文件
[html] view plaincopy
select from Teacher where c_id=#{id} and sex=#{sex}
测试代码
[java] view plaincopy
List tList = teacherMapperselectTeacher("2","男");
for (Teacher entityTemp : tList) {
Systemoutprintln(entityTemptoString());
// 注意此处可以是任何集合类,不限于列表
一、 用macro实现自定义指令,例如: 自定义指令可以使用macro指令来定义。 <#macro greet person> <font size="+2">Hello ${person}!</font> </#macro> macro指令自身不打印任何内容,它只是用来创建宏变量,所以就会有一个名为greet的变量。 使用这个宏: <@greet person="Fred"/> 会打印出: <font size="+2">Hello Fred!</font> 二、用java代码标签实现自定义指令: 可以使用TemplateDirectiveModel接口在Java代码中实现自定义指令。 简单示例如下: 1、实现TemplateDirectiveModel接口。 public class UpperDirective implements TemplateDirectiveModel { public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body) throws TemplateException, IOException { if (!paramsisEmpty()) { throw new TemplateModelException( "parameters 此处没有值!"); } if (loopVarslength != 0) { throw new TemplateModelException( " variables 此处没有值!"); } if (body != null) { //执行nested body 与FTL中 <#nested> 类似。 bodyrender(new UpperCaseFilterWriter(envgetOut())); } else { throw new RuntimeException("missing body"); } } private static class UpperCaseFilterWriter extends Writer { private final Writer out; UpperCaseFilterWriter (Writer out) { thisout = out; } public void write(char[] cbuf, int off, int len) throws IOException { char[] transformedCbuf = new char[len]; for (int i = 0; i < len; i++) { transformedCbuf[i] = CharactertoUpperCase(cbuf[i + off]); } outwrite(transformedCbuf); } public void flush() throws IOException { outflush(); } public void close() throws IOException { outclose(); } } } 说明:<#nested>指令执行位于开始和结束标记指令之间的模板代码段。 2、注入FreeMarkerConfigurer的freemarkerVariables中。 例如:在jeecms-servlet-frontxml <entry key="upper" value-ref="upper"/> <bean id="upper" class="comexampleUpperDirective" /> 说明: FreeMarkerConfigurer 、setFreemarkerVariables(Map<String,Object> variables) 底层调用了FreeMarker的ConfigurationsetAllSharedVariables()方法。 因为更好的实践是将常用的指令作为共享变量放到Configuration中。 3、调用自定义指令: [@upper] bar [#list ["red", "green", "blue"] as color] ${color} [/#list] baaz [/@upper] 4、显示输出结果: BAR RED GREEN BLUE BAAZ
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
mapput("key1", "value1");
mapput("key2", "value2");
mapput("key3", "value3");
Set<String> keySet = mapkeySet();
int i = mapsize()-1;
Map<Integer, String> mapKey = new HashMap<Integer, String>();
Map<Integer, String> mapValue = new HashMap<Integer, String>();
for(javautilMapEntry<String, String> entry : mapentrySet()) {
//将原来MAP的VALUE放入新的MAP的VALUE里面
mapKeyput(i, entrygetValue());
//将原来MAP的KEY放入新的MAP的VALUE 里面
mapValueput(i, entrygetKey());
i--;
}
//打印KEY值
Systemoutprintln(mapKeyget(2));
//打印VALUE值
Systemoutprintln(mapValueget(0));
}
扩展资料:
java键值对的使用
Map集合没有继承Collection接口,但是其提供了key到value的映射。每一个key不能有相同,每个key只能映射一个value值。
下面通过一个程序来说明键值对的使用,下面是一个基本的键值对应用程序:
package Test;
import javautilCollection;
import javautilHashMap;
import javautilIterator;
import javautilMap;
import javautilSet;
public class KeyValue {
public static void main(String[] args) {
Map <String,String> map=new HashMap<>();
mapput("01", "张三");
mapput("02", "王五");
Set<String> set=mapkeySet();
Iterator <String> it=setiterator();
Systemoutprintln("key中集合元素:");
while(ithasNext()){
Systemoutprintln(itnext());
}
Collection <String> coll=mapvalues();
it=colliterator();
Systemoutprintln("value中集合元素:");
while(ithasNext()){
Systemoutprintln(itnext());
}
}
}
输出结果如图所示:
重写自定义对象的hashcode()方法,让内容相同的对象返回一样的hashcode默认情况自定义对象是以内存地址为hashcode,你“重新创建一个一样的对象”,存在“重新创建”就会导致对象不一样所以要重写覆盖hashcode方法才能获取到map值
另外,也可以低层一点,你的自定义对象上设一个int id属性 而Map转为以id为键,比如Map<int, Value>。
以上就是关于如何获取map的key和value全部的内容,包括:如何获取map的key和value、JAVA 如何把一个局部变量(Map类型的)的值, 取出来返回给调用者、easyui控件,如何在页面中获取map类型的list集合的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)