java Map根据value得到key值

Map提供了根据key取得value的方法, get(value)  这是唯一对应的(如果存在),即一个key只会对应到一个value。但是Java类库没有提供Map根据value取得key的方法。所以需要自己实现,两种方法:

 

一.   直接根据value取得key(可能有多个)

import java.util.*;

/**
 * @version 14.1.8
 * @author Administrator
 * @see 在map中根据value值取得key值
 */
public class Map_ValueGetKey {
	HashMap map;

	public Map_ValueGetKey(HashMap map) { // 初始化操作
		this.map = map;
	}

	public Object getKey(Object value) {
		Object o = null;
		ArrayList all = new ArrayList(); // 建一个数组用来存放符合条件的KEY值

		/*
		 * 这里关键是那个entrySet()的方法,它会返回一个包含Map.Entry集的Set对象.
		 * Map.Entry对象有getValue和getKey的方法,利用这两个方法就可以达到从值取键的目的了 *
		 */

		Set set = map.entrySet();
		Iterator it = set.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			if (entry.getValue().equals(value)) {
				o = entry.getKey();
				all.add(o); // 把符合条件的项先放到容器中,下面再一次性打印出
			}
		}
		return all;
	}

	public static void main(String[] args) {
		HashMap map = new HashMap();
		map.put("1", "a");
		map.put("2", "b");
		map.put("3", "c");
		map.put("4", "c");
		map.put("5", "e");
		Map_ValueGetKey mvg = new Map_ValueGetKey(map);
		System.out.println(mvg.getKey("c"));
	}

}


二.新建一个value为key 的Map类继承自 HashMap,覆盖一些方法:

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * @see 建立一个value HashMap类
 * @author Administrator
 *
 * @param <K>
 * @param <V>
 */
public class ValueHashMap<K, V> extends HashMap<K, V> {

    private static final long serialVersionUID = 4136683943755968213L;
    
    protected Map<V, Set<K>> valueMap;
    
    protected boolean isDebug = false;

    public ValueHashMap() {
        super();
        initValueMap();
    }

    public ValueHashMap(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor);
        initValueMap();
    }

    public ValueHashMap(int initialCapacity) {
        super(initialCapacity);
        initValueMap();
    }
    
    public ValueHashMap(Map<? extends K, ? extends V> m) {
        super(m);
        initValueMap();
    }

    private void initValueMap() {
        valueMap = new HashMap<V, Set<K>>();
    }

    @Override
    public void clear() {
        super.clear();
        valueMap.clear();
    }

    @Override
    public V put(K key, V value) {
        V v = super.put(key, value);
        putValue(key, value);
        debugValueMap(key, value);
        return v;
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
        super.putAll(m);
        for(Map.Entry<? extends K, ? extends V> entry : m.entrySet()) {
            putValue(entry.getKey(), entry.getValue());
            debugValueMap(entry.getKey(), entry.getValue());
        }        
    }
    
    @Override
    public V remove(Object key) {
        if(!containsKey(key)) {
            return null;
        }
        V v = super.remove(key);
        removeValueMapKey(key, v);
        debugValueMap(key, null);
        return v;
    }
    
    public Set<K> getKeySet(V value) {
        return Collections.unmodifiableSet(valueMap.get(value)); //将得到的Set设置为不可变的
    }
    
    protected void putValue(K key, V value) {
        Set<K> keys = valueMap.get(value);
        if(keys == null) {
            keys = new HashSet<K>();
            valueMap.put(value, keys);
        }
        keys.add(key);
    }
    
    protected void removeValueMapKey(Object key, V value) {
        valueMap.get(value).remove(key);
    }
    
    protected void debugValueMap(Object key, V value) {
        if(!isDebug) {
            return;
        }
        StackTraceElement se = new Throwable().getStackTrace()[1];
        System.out.print(se.getMethodName() + ": ");
        System.out.print("key = [" + key + "]");
        if(!"remove".equals(se.getMethodName())) {
            System.out.print(", value = [" + value + "]");
        }
        System.out.println();
        for(Map.Entry<V, Set<K>> en : valueMap.entrySet()) {
            System.out.print("  [" + en.getKey() + "] --> ");
            int i = 0;
            for(K k : en.getValue()) {
                if(i++ > 0) {
                    System.out.print(", ");
                }
                System.out.print("[" + k + "]");
            }
            System.out.println();
        }
        System.out.println();
    }
}



 

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @version 14.1.8
 * @author Administrator
 * @see 测试类   测试ValueHashMap
 */
public class ValueHashMapTest {

    public static void main(String[] args) {
        Map<String, String> map = new ValueHashMap<String, String>();
        map.put("1", "1-1");
        map.put("2", "1-1");
        map.put("3", "1-1");
        map.put("4", "1-1");
        
        map.put("5", null);
        map.put("6", null);
        map.put("7", null);
        map.put("8", null);
        map.put("9", null);
        
        map.remove("9");
        
        ValueHashMap<String, String> vmap = (ValueHashMap<String, String>)map;
        
        vmap.put("10", null);
        
        vmap.remove("8");
        
        vmap.remove("a");
        
        vmap.put(null, null);
        
        Map<String, String> t = new HashMap<String, String>();
        t.put("b", null);
        t.put("c", null);
        t.put("d", "1-2");
        
        Set<String> keys = vmap.getKeySet(null);
        System.out.println("输出value为null的key");
        for(String str : keys) {
            System.out.println(str);
        }
        
        Set<String> keys2 =vmap.getKeySet("1-1");
        System.out.println("输出value为"+"1-1"+"的key");
        for(String str2 : keys2){
        	System.out.println(str2);
        }
    }
}


 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值