java Map<k,v>取值问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java Map<k,v>取值问题相关的知识,希望对你有一定的参考价值。

键k对应值v为一个含有多个属性(name,sex……)的对象,如何取出这些属性值?

map 是键-值对应的
也就是你通过键能取到值(在这里是你的对象)
取出来的对象,通过点操作访问属性的值

比如
Map<String,User> users=new HashMap<String,User>();
我假设里面有数据
users["John"].getName();

反正只要取到对应的value,而且value是对象的话,你就把他当成对象来处理,可以自用他的属性和方法
参考技术A 你好,你可以将值v封装成一个对象,按你的说的举个例子,
Map<K,Person> map =new HashMap<K,Person>() ;
K按你原来的取,这样你在遍历的时候,就可以从person对象中取出name,sex...
参考技术B String name = (String)map.get("name");
String sex = (String)map.get("sex");
.......
参考技术C 环境规划

排序

1 、对map排序

 public static<K,V> Map<K,V> sortMapValue(Map<K,V> map,final String...fields)  
        Map<K,V> tempmap=new LinkedHashMap<K,V>();  
        Set<Entry<K,V>> set=new TreeSet<Entry<K,V>>(new Comparator<Entry<K,V>>()   
            @Override  
            public int compare(Entry<K, V> o1, Entry<K, V> o2)   
                int valflag=0;  
                final String ClassName=o1.getValue().getClass().getSimpleName();//得到V的类型  
                int keyflag=o1.getKey().toString().compareTo(o2.getKey().toString());  
                //比较基本类型和String类型  
                if(ClassName.equals("String")||ClassName.equals("Byte")||ClassName.equals("Character")||ClassName.equals("Short")||  
                        ClassName.equals("Integer")||ClassName.equals("Long")||ClassName.equals("Float")||ClassName.equals("Double"))  
                    valflag=vCompare(o1.getValue(), ClassName, o2.getValue(), ClassName);  
                    if(valflag!=0)  
                        return valflag;  
                    else  
                        return keyflag;  
                      
                else//比较对象  
                    if(fields!=null&&fields.length<=0)  
                        return 0;  
                      
                    Class clazz1=o1.getValue().getClass();  
                    Class clazz2=o2.getValue().getClass();  
                    for(String field:fields)  
                        try   
                            Field f1=clazz1.getDeclaredField(field);  
                            Field f2=clazz2.getDeclaredField(field);  
                            f1.setAccessible(true);  
                            f2.setAccessible(true);  
                            valflag=vCompare(f1.get(o1.getValue()), f1.getType().getSimpleName(),   
                                    f2.get(o2.getValue()), f2.getType().getSimpleName());  
                            if(valflag!=0)  
                                return valflag;  
                            else  
                                return keyflag;//先假设只有一个比较参数  
                              
                         catch (SecurityException e)   
                            e.printStackTrace();  
                         catch (NoSuchFieldException e)   
                            e.printStackTrace();  
                        catch (IllegalArgumentException e)   
                            e.printStackTrace();  
                         catch (IllegalAccessException e)   
                            e.printStackTrace();  
                          
                      
                  
                return valflag;  
              
        );  
        for(Map.Entry<K, V> entry:map.entrySet())  
            set.add(entry);  
          
        map.clear();  
        for(Entry<K,V> entry:set)  
//          System.out.println("#"+entry.getKey()+":"+entry.getValue());  
            tempmap.put(entry.getKey(), entry.getValue());  
            map.put(entry.getKey(), entry.getValue());//如果是LinkedHashmap的话就不用在调用的时候赋值了,否则需要重新赋值  
          
        return tempmap;  
      
/**' 
 *  
 * @param <V>值的类型 
 * @param v1 值1 
 * @param type1 值的 
 * @param v2 
 * @param type2 
 * @return 
 */  
public static<V> int vCompare(V v1,String type1,V v2,String type2)  
    int valflag=0;  
    if(type1.equalsIgnoreCase("String"))  
        return v1.toString().compareTo(v2.toString());  
    else if(type1.equalsIgnoreCase("Byte")||type1.equalsIgnoreCase("Character")||type1.equalsIgnoreCase("Short")||type1.equalsIgnoreCase("Integer")  
            ||type1.equalsIgnoreCase("Long")||type1.equalsIgnoreCase("Float")||type1.equalsIgnoreCase("Double")||type1.equalsIgnoreCase("int")  
            ||type1.equalsIgnoreCase("char"))  
        valflag=(int)(Double.parseDouble(v1.toString())-Double.parseDouble(v2.toString()));  
//      System.out.println(v1.toString()+":"+v2.toString());  
//      System.out.println(valflag+":"+(Double.parseDouble(v1.toString())+":"+Double.parseDouble(v2.toString())));  
        return valflag;  
      
    return 0;  
  
 


2

以上是关于java Map<k,v>取值问题的主要内容,如果未能解决你的问题,请参考以下文章

java Map集合遍历取值的五种方式

番石榴:Set<K> + Function<K,V> = Map<K,V>?

将 Map<K, List<V>> 转换为 Map<K, V> 其中 V 有 2 个对象列表

Java基础之Map类

Map集合。

Java HashMap用法