
map是一种映射,是常用的STL容器。(map可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器))
如需使用,需要加一个map头文件。
1map的定义:
map mp;
使用map要确定映射前类型(键key)和映射后的类型(值value)。
注意:如果是字符串到整形的映射,必须使用string而不是char数组。
例子:
(1)map<set ,string>mp;</set
2map容器内元素的访问:
(1)通过下标访问:
比如:
map mp;
mp['c']=20;
mp['c']=30;
printf("%d",m['c'])输出的是30;
(2)通过迭代器访问:
定义方式:
map ::iterator it;
map迭代器的使用方式和其他STL容器的迭代器不同,因为map的每一对映射都有两个typename,这决定了必须能通过一个it来同时访问键和值。事实上,map可以使用it->first来访问键,使用it->second来访问值。
3map常用函数实例解析:
(1)find()
find(key)返回键为key的映射的迭代器,时间复杂度为N(logN),N为map中映射的个数。
(2)erase()
erase有两种用法:
第一种:删除单个元素,删除一个区间内的所有元素。
删除单个元素的方法==》mperase(it),it为删除的元素的迭代器,时间复杂度为O(1)。
mperase(key),key为欲删除的键。时间复杂度为O(logN),N为map内元素的个数。
第二种:删除一个区间内的所有元素。
mperase(firse,last)删除[first,last)
时间复杂度O(last-first)
(3)size()
size()用来获得map中映射的对数,时间复杂度为O(1)。
(4)clear()
clear()用来清空map中的所有元素,复杂度为O(N),其中N为map中的元素的个数。
4map的常见用途:
1需要建立字符(或字符串)与整数之间映射的题目,使用map可以减少代码量。
2判断大整数或者其他类型数据是否存在的题目,可以把map当bool数组用。
3字符串和字符串的映射有时候也会遇到!
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>
在EL中,方括号运算符用来检索数组和集合的元素。对于实现 javautilMap 接口的集合,方括号运算符使用关联的键查找存储在映射中的值。\x0d\\x0d\在方括号中指定键,并将相应的值作为表达式的值返回。例如,表达式 ${map['key']} 返回与 map标识符所引用的 Map 中的 "key" 键相关联的值。 \x0d\当forEach 的items属性中的表达式的值是javautilMap时,则var中命名的变量的类型就是 javautilMapEntry。这时var=entry的话,用表达式${entrykey}取得键名。用表达${entryvalue}得到每个entry的值。这是因为javautilMapEntry对象有getKey和getValue方法,表达式语言遵守JavaBean的命名约定。 \x0d\ map2 = new HashMap(); \x0d\map2put("a","hello world"); \x0d\map2put("b","this is map"); \x0d\requestsetAttribute("map2",map2); \x0d\%> \x0d\
\x0d\键值对遍历
\x0d\ \x0d\${itemkey} > ${itemvalue}
\x0d\ \x0d\键遍历
\x0d\ \x0d\${itemkey}
\x0d\ \x0d\值遍历
\x0d\ \x0d\${itemvalue}
\x0d\ \x0d\ \x0d\
\x0d\ list = new ArrayList(); \x0d\listadd("first"); \x0d\listadd("second"); \x0d\List list2 = new ArrayList(); \x0d\list2add("aaaaaa"); \x0d\list2add("bbbbbb"); \x0d\Map> map = new HashMap(); \x0d\mapput("a",list); \x0d\mapput("b",list2); \x0d\requestsetAttribute("map",map); \x0d\%> \x0d\通过键获得列表值,并遍历列表
\x0d\ \x0d\${item }
\x0d\
\x0d\ \x0d\${item }
\x0d\
\x0d\map中值为列表,直接遍历列表中的每一项
\x0d\ \x0d\ \x0d\${it }
\x0d\ \x0d\
java 获取map中所有的key和value值
javautilIterator 对 collection 进行迭代的迭代器。
javautilIterator it = mapentrySet()iterator();
while(ithasNext()){
javautilMapEntry entry = (javautilMapEntry)itnext();
entrygetKey() //返回对应的键
entrygetValue() //返回对应的值
}
以前遍历Map key-value比较习惯的方式是先获取Map中的所有key值,
然后根据key,依次从Map中去数据,基本方式如下:
Map<String,String> testData = new HashMap<String, String>();
Set<String> keys = testDatakeySet();
for(String key :keys){
Systemoutprintln(key+" "+testDataget(key));
}
上述其中是第一种方法,原来一直用上述方法主要是自己有点懒,有了一种方法后就觉得够用的了,今天看源码,发现还Map接口中还有一个Entry<K,V>的接口,对应的还有一个 Set<MapEntry<K, V>> entrySet();方法。
也就是说其实Map中的每条key-value数据对应着一个Entry,这样的话遍历Map其实就是要取出每个Entry,也就有了第二种遍历方法:
Set<Entry<String, String>> entries = testDataentrySet();
for (Entry<String, String> entry : entries) {
Systemoutprintln(entrygetKey()+":"+entrygetValue());
}
当少量的数据时,上述两种方法的效率是差不多的,当数据比较多时,第二种还是要比第一种快。
当然上述说的两种遍历针对的情况是遍历出key-value,如果是只想遍历key或value,大可不必用以上的方法了,Map中提供了Set<K> keySet()和Collection<V> values()。
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());
}
}
}
输出结果如图所示:
end是map的尾部,没有实际元素,可以 iter = mapend(); iter --;
总结了一些map基本简单实用的 *** 作:
map最基本的构造函数;
map<string , int >mapstring; map<int ,string >mapint;
map<sring, char>mapstring; map< char ,string>mapchar;
map<char ,int>mapchar; map<int ,char >mapint;
2 map添加数据;
map<int ,string> maplive;
1mapliveinsert(pair<int,string>(102,"aclive"));
2mapliveinsert(map<int,string>::value_type(321,"hai"));
3, maplive[112]="April";//map中最简单最常用的插入添加!
3map中元素的查找:
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
map<int ,string >::iterator l_it;;
l_it=maplivefind(112);
if(l_it==mapliveend())
cout<<"we do not find 112"<<endl;
else cout<<"wo find 112"<<endl;
4,map中元素的删除:
如果删除112;
map<int ,string >::iterator l_it;;
l_it=maplivefind(112);
if(l_it==mapliveend())
cout<<"we do not find 112"<<endl;
else mapliveerase(l_it); //delete 112;
5,map中 swap的用法:
Map中的swap不是一个容器中的元素交换,而是两个容器交换;
For example:
#include <map>
#include <iostream>
using namespace std;
int main( )
{
map <int, int> m1, m2, m3;
map <int, int>::iterator m1_Iter;
m1insert ( pair <int, int> ( 1, 10 ) );
m1insert ( pair <int, int> ( 2, 20 ) );
m1insert ( pair <int, int> ( 3, 30 ) );
m2insert ( pair <int, int> ( 10, 100 ) );
m2insert ( pair <int, int> ( 20, 200 ) );
m3insert ( pair <int, int> ( 30, 300 ) );
cout << "The original map m1 is:";
for ( m1_Iter = m1begin( ); m1_Iter != m1end( ); m1_Iter++ )
cout << " " << m1_Iter->second;
cout << "" << endl;
// This is the member function version of swap
//m2 is said to be the argument map; m1 the target map
m1swap( m2 );
cout << "After swapping with m2, map m1 is:";
for ( m1_Iter = m1begin( ); m1_Iter != m1end( ); m1_Iter++ )
cout << " " << m1_Iter -> second;
cout << "" << endl;
cout << "After swapping with m2, map m2 is:";
for ( m1_Iter = m2begin( ); m1_Iter != m2end( ); m1_Iter++ )
cout << " " << m1_Iter -> second;
cout << "" << endl;
// This is the specialized template version of swap
swap( m1, m3 );
cout << "After swapping with m3, map m1 is:";
for ( m1_Iter = m1begin( ); m1_Iter != m1end( ); m1_Iter++ )
cout << " " << m1_Iter -> second;
cout << "" << endl;
}
6map的sort问题:
Map中的元素是自动按key升序排序,所以不能对map用sort函数:
For example:
#include <map>
#include <iostream>
using namespace std;
int main( )
{
map <int, int> m1;
map <int, int>::iterator m1_Iter;
m1insert ( pair <int, int> ( 1, 20 ) );
m1insert ( pair <int, int> ( 4, 40 ) );
m1insert ( pair <int, int> ( 3, 60 ) );
m1insert ( pair <int, int> ( 2, 50 ) );
m1insert ( pair <int, int> ( 6, 40 ) );
m1insert ( pair <int, int> ( 7, 30 ) );
cout << "The original map m1 is:"<<endl;
for ( m1_Iter = m1begin( ); m1_Iter != m1end( ); m1_Iter++ )
cout << m1_Iter->first<<" "<<m1_Iter->second<<endl;
}
The original map m1 is:
1 20
2 50
3 60
4 40
6 40
7 30
请按任意键继续
7, map的基本 *** 作函数:
C++ Maps是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
MAP 元素 | map 对象
--------------------------------------------------------------------------------
包含客户端图像映射的坐标数据。
成员表
下面的表格列出了 map 对象引出的成员。请单击左侧的标签来选择你想要查看的成员类型。
标签属性/属性
SHOW:
标签属性/属性
行为
集合
事件
方法
样式
标签属性 属性 描述
canHaveChildren 获取表明对象是否可以包含子对象的值。
canHaveHTML 获取表明对象是否可以包含丰富的 HTML 标签的值。
CLASS className 设置或获取对象的类。
DIR dir 设置或获取对象的阅读顺序。
disabled 获取表明用户是否可与该对象交互的值。
firstChild 获取对象的 childNodes 集合的第一个子对象的引用。
ID id 获取标识对象的字符串。
innerHTML 设置或获取位于对象起始和结束标签内的 HTML。
innerText 设置或获取位于对象起始和结束标签内的文本。
isContentEditable 获取表明用户是否可编辑对象内容的值。
isDisabled 获取表明用户是否可与该对象交互的值。
isMultiLine 获取表明对象的内容是包含一行还是多行的值。
isTextEdit 获取是否可使用该对象创建一个 TextRange 对象。
LANG lang 设置或获取要使用的语言。
LANGUAGE language 设置或获取当前脚本编写用的语言。
lastChild 获取该对象 childNodes 集合中最后一个子对象的引用。
NAME name 设置或获取对象的名称。
nextSibling 获取对此对象的下一个兄弟对象的引用。
nodeName 获取特定结点类型的名称。
nodeType 获取所需结点的类型。
nodeValue 设置或获取结点的值。
offsetHeight 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度。
offsetLeft 获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置。
offsetParent 获取定义对象 offsetTop 和 offsetLeft 属性的容器对象的引用。
offsetTop 获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置。
offsetWidth 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的宽度。
outerHTML 设置或获取对象及其内容的 HTML 形式。
outerText 设置或获取对象的文本。
ownerDocument 设置或获取结点关联的 document 对象。
parentElement 获取对象层次中的父对象。
parentNode 获取文档层次中的父对象。
parentTextEdit 获取文档层次中可用于创建包含原始对象的 TextRange 的容器对象。
previousSibling 获取对此对象的上一个兄弟对象的引用。
readyState 获取对象的当前状态。
scopeName 获取为该元素定义的命名空间。
sourceIndex 获取对象在源序中的依次位置,即对象出现在 document 的 all 集合中的顺序。
STYLE 为该设置元素设置内嵌样式。
tagName 获取对象的标签名称。
tagUrn 设置或获取在命名空间声明中指定的统一资源名称(URN)。
TITLE title 设置或获取对象的咨询信息(工具提示)。
uniqueID 获取为对象自动生成的唯一标识符。
标签属性/属性
行为
行为 描述
clientCaps 提供关于 Internet Explorer 支持的特性的信息,以及提供即用即装的方法。
download 下载文件并在下载完成后通知一个指定的回调函数。
homePage 包含关于用户主页的信息。
>
两种方式:
1 ageList 设置在 Fields:
((HashMap)$F{ageList}get($V{REPORT_COUNT})get("name")
2 ageList 设置在 Parameters:
((HashMap)$P{ageList}get($V{REPORT_COUNT})get("name")
分拆:
a $V{REPORT_COUNT} 计数和for循环里面的 i++一样 默认值1
b $P{ageList}get($V{REPORT_COUNT}) 获取List里面的下标为1的元素
c (HashMap)$P{ageList}get($V{REPORT_COUNT})get("name") 把获取的元素转换成HashMap 获取key的值
设置参数为javautilList
以上就是关于map的常用用法详解全部的内容,包括:map的常用用法详解、easyui控件,如何在页面中获取map类型的list集合的值、EL表达式怎么获取Map的动态key等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)