50,504
社区成员
发帖
与我相关
我的任务
分享
Map<String, String[]> tempMap = new HashMap<String, String[]>();
key value
a[a1][a11] 一个字符串数组
a[a1][a12] 一个字符串数组
b[b1][b11] 一个字符串数组
b[b2][b21] 一个字符串数组
b[b2][b22] 一个字符串数组
b[b3][b31] 一个字符串数组
......... .........
n[nx][nxx]......[nxxxxx] 一个字符串数组
Map.get("a").get("a1").get("a11");
Map.get("a").get("a1").get("a12");
private static final Map<String,String> keyPathMap=new LinkedHashMap<String, String>();
/**
* 入口 传入map
* @param tempMap
* @return
*/
private static Map<String, Object> changeMapToMapTree(Map<String, String[]> tempMap){
Map<String, Object> checkMap=new HashMap<String, Object>();
Set<String> keySet = tempMap.keySet();
for (Iterator iterator = keySet.iterator(); iterator
.hasNext();) {
String str = (String) iterator.next();
Map<String, Object> createMap = createMap(str, tempMap.get(str));
checkMap = combine(checkMap, createMap);
String[] split = str.replaceAll("]", "").split("\\[");
Map<String, Object> map=new HashMap<String, Object>();
for (int i = 0; i < split.length; i++) {
if(i==0){
keyPathMap.put(split[i], split[i]);
}else{
keyPathMap.put(split[i], keyPathMap.get(split[i-1])+","+split[i]);
}
}
}
return checkMap;
}
/**
* 格式化map
* @param mapKey map的key
* @param value
* @return
*/
private static Map<String, Object> createMap(String mapKey,String[] value){
String[] split = mapKey.replaceAll("]", "").split("\\[");
Map<String, Object> map=new HashMap<String, Object>();
map.put(split[split.length-1], value);
if(split.length-1==0){
return map;
}
Map<String, Object> ownMap=new HashMap<String, Object>();
ownMap.put(split[split.length-2], map);
if(split.length-2==0){
return ownMap;
}
Map<String, Object> allMap=new HashMap<String, Object>();
for (int i = split.length-3; i >= 0; i--) {
Map<String, Object> tempMap=new HashMap<String, Object>();
tempMap.put(split[i], ownMap);
ownMap=tempMap;
allMap.putAll(ownMap);
}
Map<String, Object> temp = (Map<String, Object>) allMap.get(split[0]);
allMap.clear();
allMap.put(split[0], temp);
return allMap;
}
/**
* 获取map的值
* @param infoMap map
* @param mapKey 按顺序排列的key值(变长数组)
* @return
*/
private static String[] getMapValue(Map<String, Object> infoMap,String... mapKey){
Map<String, Object> tempMap=infoMap;
for (int i = 0; i < mapKey.length; i++) {
if(i==mapKey.length-1){
return (String[])tempMap.get(mapKey[i]);
}else{
tempMap=(Map<String, Object>)tempMap.get(mapKey[i]);
}
}
return null;
}
/**
* 获取map的深层次对象
* @param infoMap map
* @param mapKey 按顺序排列的key值(变长数组)
* @return
*/
private static Map<String, Object> getMapByKeys(Map<String, Object> infoMap,String... mapKey){
Map<String, Object> tempMap=infoMap;
for (int i = 0; i < mapKey.length; i++) {
Object object = tempMap.get(mapKey[i]);
if(object!=null){
if(object.getClass() != String[].class){
tempMap=(Map<String, Object>)object;
}
}
}
return tempMap;
}
/**
* 将两个map中key相同的value合并起来
*
* @param map1
* @param map2
* @return
*/
public static Map<String, Object> combine(Map<String, Object> map1, Map<String, Object> map2) {
if (map1==null||map1.size()==0) {
return map2;
}
if (map2==null||map2.size()==0) {
return map1;
}
Set<String> keySet2 = map2.keySet();
for (Iterator iterator = keySet2.iterator(); iterator
.hasNext();) {
String str = (String) iterator.next();
if(keyPathMap.containsKey(str)){
try {
String[] split = keyPathMap.get(str).split(",");
Map<String, Object> mapByKeys = getMapByKeys(map1, split);
Map<String, Object> temp = (Map<String, Object>) map2.get(str);
Set<String> tempSet = temp.keySet();
for (Iterator iterator1 = tempSet.iterator(); iterator1
.hasNext();) {
String string = (String) iterator1.next();
if(mapByKeys.containsKey(string)){
combineForeach(mapByKeys, temp);
}else{
mapByKeys.put(string, temp.get(string));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
map1.put(str, (Map<String, Object>)map2.get(str));
}
}
return map1;
}
/**
* 将两个map中key相同的value合并起来
*
* @param map1
* @param map2
*/
public static void combineForeach(Map<String, Object> map1, Map<String, Object> map2) {
if (map1==null||map1.size()==0) {
map1= map2;
return;
}
if (map2==null||map2.size()==0) {
return;
}
Set<String> keySet2 = map2.keySet();
for (Iterator iterator = keySet2.iterator(); iterator
.hasNext();) {
String str = (String) iterator.next();
if(keyPathMap.containsKey(str)){
try {
String[] split = keyPathMap.get(str).split(",");
Map<String, Object> mapByKeys = getMapByKeys(map1, split);
Map<String, Object> temp = (Map<String, Object>) map2.get(str);
Set<String> tempSet = temp.keySet();
for (Iterator iterator1 = tempSet.iterator(); iterator1
.hasNext();) {
String string = (String) iterator1.next();
if(mapByKeys.containsKey(string)){
combine(mapByKeys, temp);
}else{
mapByKeys.put(string, temp.get(string));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
map1.put(str, (Map<String, Object>)map2.get(str));
}
}
}
public static void main(String[] args) {
String[] strs=new String[]{"a","b","c","d"};
Map<String, String[]> tempMap=new HashMap<String, String[]>();
tempMap.put("a[a1][a11]", strs);
tempMap.put("a[a1][a12][a121]", strs);
tempMap.put("b[b1]", strs);
tempMap.put("b[b2][b21]", strs);
tempMap.put("b[b2][b22][b221][b2211]", strs);
tempMap.put("b[b3][b31]", strs);
tempMap.put("b[b3][b32][b321][b3211][b32111]", strs);
Map<String, Object> checkMap = changeMapToMapTree(tempMap);
String[] mapByKeys = getMapValue(checkMap, "b","b3","b32","b321","b3211","b32111");
for (String string : mapByKeys) {
System.out.println(string);
}
}
[/quote]
谢谢 解决了已经
private static final Map<String,String> keyPathMap=new LinkedHashMap<String, String>();
/**
* 入口 传入map
* @param tempMap
* @return
*/
private static Map<String, Object> changeMapToMapTree(Map<String, String[]> tempMap){
Map<String, Object> checkMap=new HashMap<String, Object>();
Set<String> keySet = tempMap.keySet();
for (Iterator iterator = keySet.iterator(); iterator
.hasNext();) {
String str = (String) iterator.next();
Map<String, Object> createMap = createMap(str, tempMap.get(str));
checkMap = combine(checkMap, createMap);
String[] split = str.replaceAll("]", "").split("\\[");
Map<String, Object> map=new HashMap<String, Object>();
for (int i = 0; i < split.length; i++) {
if(i==0){
keyPathMap.put(split[i], split[i]);
}else{
keyPathMap.put(split[i], keyPathMap.get(split[i-1])+","+split[i]);
}
}
}
return checkMap;
}
/**
* 格式化map
* @param mapKey map的key
* @param value
* @return
*/
private static Map<String, Object> createMap(String mapKey,String[] value){
String[] split = mapKey.replaceAll("]", "").split("\\[");
Map<String, Object> map=new HashMap<String, Object>();
map.put(split[split.length-1], value);
if(split.length-1==0){
return map;
}
Map<String, Object> ownMap=new HashMap<String, Object>();
ownMap.put(split[split.length-2], map);
if(split.length-2==0){
return ownMap;
}
Map<String, Object> allMap=new HashMap<String, Object>();
for (int i = split.length-3; i >= 0; i--) {
Map<String, Object> tempMap=new HashMap<String, Object>();
tempMap.put(split[i], ownMap);
ownMap=tempMap;
allMap.putAll(ownMap);
}
Map<String, Object> temp = (Map<String, Object>) allMap.get(split[0]);
allMap.clear();
allMap.put(split[0], temp);
return allMap;
}
/**
* 获取map的值
* @param infoMap map
* @param mapKey 按顺序排列的key值(变长数组)
* @return
*/
private static String[] getMapValue(Map<String, Object> infoMap,String... mapKey){
Map<String, Object> tempMap=infoMap;
for (int i = 0; i < mapKey.length; i++) {
if(i==mapKey.length-1){
return (String[])tempMap.get(mapKey[i]);
}else{
tempMap=(Map<String, Object>)tempMap.get(mapKey[i]);
}
}
return null;
}
/**
* 获取map的深层次对象
* @param infoMap map
* @param mapKey 按顺序排列的key值(变长数组)
* @return
*/
private static Map<String, Object> getMapByKeys(Map<String, Object> infoMap,String... mapKey){
Map<String, Object> tempMap=infoMap;
for (int i = 0; i < mapKey.length; i++) {
Object object = tempMap.get(mapKey[i]);
if(object!=null){
if(object.getClass() != String[].class){
tempMap=(Map<String, Object>)object;
}
}
}
return tempMap;
}
/**
* 将两个map中key相同的value合并起来
*
* @param map1
* @param map2
* @return
*/
public static Map<String, Object> combine(Map<String, Object> map1, Map<String, Object> map2) {
if (map1==null||map1.size()==0) {
return map2;
}
if (map2==null||map2.size()==0) {
return map1;
}
Set<String> keySet2 = map2.keySet();
for (Iterator iterator = keySet2.iterator(); iterator
.hasNext();) {
String str = (String) iterator.next();
if(keyPathMap.containsKey(str)){
try {
String[] split = keyPathMap.get(str).split(",");
Map<String, Object> mapByKeys = getMapByKeys(map1, split);
Map<String, Object> temp = (Map<String, Object>) map2.get(str);
Set<String> tempSet = temp.keySet();
for (Iterator iterator1 = tempSet.iterator(); iterator1
.hasNext();) {
String string = (String) iterator1.next();
if(mapByKeys.containsKey(string)){
combineForeach(mapByKeys, temp);
}else{
mapByKeys.put(string, temp.get(string));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
map1.put(str, (Map<String, Object>)map2.get(str));
}
}
return map1;
}
/**
* 将两个map中key相同的value合并起来
*
* @param map1
* @param map2
*/
public static void combineForeach(Map<String, Object> map1, Map<String, Object> map2) {
if (map1==null||map1.size()==0) {
map1= map2;
return;
}
if (map2==null||map2.size()==0) {
return;
}
Set<String> keySet2 = map2.keySet();
for (Iterator iterator = keySet2.iterator(); iterator
.hasNext();) {
String str = (String) iterator.next();
if(keyPathMap.containsKey(str)){
try {
String[] split = keyPathMap.get(str).split(",");
Map<String, Object> mapByKeys = getMapByKeys(map1, split);
Map<String, Object> temp = (Map<String, Object>) map2.get(str);
Set<String> tempSet = temp.keySet();
for (Iterator iterator1 = tempSet.iterator(); iterator1
.hasNext();) {
String string = (String) iterator1.next();
if(mapByKeys.containsKey(string)){
combine(mapByKeys, temp);
}else{
mapByKeys.put(string, temp.get(string));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
map1.put(str, (Map<String, Object>)map2.get(str));
}
}
}
public static void main(String[] args) {
String[] strs=new String[]{"a","b","c","d"};
Map<String, String[]> tempMap=new HashMap<String, String[]>();
tempMap.put("a[a1][a11]", strs);
tempMap.put("a[a1][a12][a121]", strs);
tempMap.put("b[b1]", strs);
tempMap.put("b[b2][b21]", strs);
tempMap.put("b[b2][b22][b221][b2211]", strs);
tempMap.put("b[b3][b31]", strs);
tempMap.put("b[b3][b32][b321][b3211][b32111]", strs);
Map<String, Object> checkMap = changeMapToMapTree(tempMap);
String[] mapByKeys = getMapValue(checkMap, "b","b3","b32","b321","b3211","b32111");
for (String string : mapByKeys) {
System.out.println(string);
}
}
"asd[qwe][gasdgasd][vzxcvas]";
"asd";
"asd[ytry123][dsad]";
//上面这些都是允许的
我刚开始想过正则!但是循环不出来![/quote]
单个转能转 但是要把相同key的值合在一起就比较麻烦了[/quote]
单个转的例子 可一给一个么?
"asd[qwe][gasdgasd][vzxcvas]";
"asd";
"asd[ytry123][dsad]";
//上面这些都是允许的
我刚开始想过正则!但是循环不出来![/quote]
单个转能转 但是要把相同key的值合在一起就比较麻烦了
"asd[qwe][gasdgasd][vzxcvas]";
"asd";
"asd[ytry123][dsad]";
//上面这些都是允许的
我刚开始想过正则!但是循环不出来!
String str = "a[a1][a11]"; //假设对应的值是11111
String str = "a[a1][a12]"; //假设对应的值是22222
/**
* 下面这种情况 是针对 n[nx][nxx] 这种类型的 需要三层map 但是n[nx][nxx][nxxx][nxxxx][nxxxxx][nxxxxxx][nxxxxxxx]...... 这种也坑能会出现! 所以不会怎么循环了!
*/
Map<String, Map> map = new HashMap<String, Map>();
Map<String, Map> map1 = new HashMap<String, Map>();
Map<String, String> map2 = new HashMap<String, String>();
map2.put("a11", "11111");
map2.put("a12", "22222");
map1.put("a1", map2);
map.put("a", map1);
Map<String, String[]> tempMap = new HashMap<String, String[]>();
key value
a[a1][a11] 一个字符串数组
Map.get("a").get("a1").get("a11");
这三个联合起来看是行不通的。
tempMap的value为String[] ,你通过Map.get("a");得到就是一个Stirng[] ,它不可能再有get方法了。
而就算第三种取值有问题,你第二种的key为value应该是Map<String, String[String[]]>
终上所述,
你 说 的 究 竟 是 什 么 鬼 ?