一个Key对应多个Value
2018-03-27 14:53
2566 查看
Map 一个key对应一个value,它可以满足大部分需求。但有时我要用到一个key对应多个value怎么办?
1.普通做法
Map<Object,List<Object>> map=new HashMap<>();
2.apache commons工具包里有个org.apache.commons.collections.map.MultiValueMap。
3.开源项目NoHttp里的MultiValueMap。public interface MultiValueMap<K, V> {
/**
* 添加Key-Value
*
* @param key key.
* @param value value.
*/
void add(K key, V value);
/**
* 添加Key-List<Value>
*
* @param key key.
* @param values values.
*/
void add(K key, List<V> values);
/**
* 设置一个Key-Value,如果这个Key存在就被替换,不存在则被添加。
*
* @param key key.
* @param value values.
*/
void set(K key, V value);
/**
* 设置Key-List<Value>,如果这个Key存在就被替换,不存在则被添加。
*
* @param key key.
* @param values values.
* @see #set(Object, Object)
*/
void set(K key, List<V> values);
/**
* 移除某一个Key,对应的所有值也将被移除。
*
* @param key key.
* @return value.
*/
List<V> remove(K key);
/**
* 移除所有的值。
*/
void clear();
/**
* 拿到Key的集合。
*
* @return Set.
*/
Set<K> keySet();
/**
* 拿到所有的值的集合。
*
* @return List.
*/
List<V> values();
/**
* 获取EntrySet.
*
* @return {@link Set}.
*/
Set<Map.Entry<K, List<V>>> entrySet();
/**
* 拿到某一个Key下的某一个值。
*
* @param key key.
* @param index index value.
* @return The value.
*/
V getValue(K key, int index);
/**
* 拿到某一个Key下的第一个值。
*
* @param key key.
* @return The value.
*/
V getFirstValue(K key);
/**
* 拿到某一个Key下的所有值。
*
* @param key key.
* @return values.
*/
List<V> getValues(K key);
/**
* 拿到MultiValueMap的大小.
*
* @return size.
*/
int size();
/**
* 判断MultiValueMap是否为null.
*
* @return True: empty, false: not empty.
*/
boolean isEmpty();
/**
* 判断MultiValueMap是否包含某个Key.
*
* @param key key.
* @return True: contain, false: none.
*/
boolean containsKey(K key);
}
public static void main(String[] args) {
String key = "a";
LinkedMultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
multiValueMap.add(key, "a");
multiValueMap.add(key, "b");
multiValueMap.add(key, "c");
multiValueMap.add(key, "d");
List<String> values = multiValueMap.getValues(key);
for (String v : values) {
System.out.println(v); //结果 a b c d
}
}
}总结:
1.普通方法,原始操作、不好维护、不可复用、不可拓展 。
2.需要引入jar包。
3.对普通方法进行封装复用。推荐使用。
1.普通做法
Map<Object,List<Object>> map=new HashMap<>();
2.apache commons工具包里有个org.apache.commons.collections.map.MultiValueMap。
3.开源项目NoHttp里的MultiValueMap。public interface MultiValueMap<K, V> {
/**
* 添加Key-Value
*
* @param key key.
* @param value value.
*/
void add(K key, V value);
/**
* 添加Key-List<Value>
*
* @param key key.
* @param values values.
*/
void add(K key, List<V> values);
/**
* 设置一个Key-Value,如果这个Key存在就被替换,不存在则被添加。
*
* @param key key.
* @param value values.
*/
void set(K key, V value);
/**
* 设置Key-List<Value>,如果这个Key存在就被替换,不存在则被添加。
*
* @param key key.
* @param values values.
* @see #set(Object, Object)
*/
void set(K key, List<V> values);
/**
* 移除某一个Key,对应的所有值也将被移除。
*
* @param key key.
* @return value.
*/
List<V> remove(K key);
/**
* 移除所有的值。
*/
void clear();
/**
* 拿到Key的集合。
*
* @return Set.
*/
Set<K> keySet();
/**
* 拿到所有的值的集合。
*
* @return List.
*/
List<V> values();
/**
* 获取EntrySet.
*
* @return {@link Set}.
*/
Set<Map.Entry<K, List<V>>> entrySet();
/**
* 拿到某一个Key下的某一个值。
*
* @param key key.
* @param index index value.
* @return The value.
*/
V getValue(K key, int index);
/**
* 拿到某一个Key下的第一个值。
*
* @param key key.
* @return The value.
*/
V getFirstValue(K key);
/**
* 拿到某一个Key下的所有值。
*
* @param key key.
* @return values.
*/
List<V> getValues(K key);
/**
* 拿到MultiValueMap的大小.
*
* @return size.
*/
int size();
/**
* 判断MultiValueMap是否为null.
*
* @return True: empty, false: not empty.
*/
boolean isEmpty();
/**
* 判断MultiValueMap是否包含某个Key.
*
* @param key key.
* @return True: contain, false: none.
*/
boolean containsKey(K key);
}
public class BasicMultiValueMap<K, V> implements MultiValueMap<K, V> { private Map<K, List<V>> mSource; public BasicMultiValueMap(Map<K, List<V>> source) { mSource = source; } @Override public void add(K key, V value) { if (!containsKey(key)) mSource.put(key, new ArrayList<V>(1)); getValues(key).add(value); } @Override public void add(K key, List<V> values) { if (!containsKey(key)) mSource.put(key, values); else mSource.get(key).addAll(values); } @Override public void set(K key, V value) { remove(key); add(key, value); } @Override public void set(K key, List<V> values) { mSource.put(key, values); } @Override public List<V> remove(K key) { return mSource.remove(key); } @Override public void clear() { mSource.clear(); } @Override public Set<K> keySet() { return mSource.keySet(); } @Override public List<V> values() { List<V> allValues = new ArrayList<>(); Set<K> keySet = keySet(); for (K key : keySet) { allValues.addAll(getValues(key)); } return allValues; } @Override public List<V> getValues(K key) { return mSource.get(key); } @Override public V getFirstValue(K key) { return getValue(key, 0); } @Override public Set<Map.Entry<K, List<V>>> entrySet() { return mSource.entrySet(); } @Override public V getValue(K key, int index) { List<V> values = getValues(key); if (values != null && values.size() > index) return values.get(index); return null; } @Override public int size() { return mSource.size(); } @Override public boolean isEmpty() { return mSource.isEmpty(); } @Override public boolean containsKey(K key) { return mSource.containsKey(key); } public Map<K, List<V>> getSource() { return mSource; } }
public class LinkedMultiValueMap<K, V> extends BasicMultiValueMap<K, V> { public LinkedMultiValueMap() { super(new LinkedHashMap<K, List<V>>()); } }测试public class Test {
public static void main(String[] args) {
String key = "a";
LinkedMultiValueMap<String, String> multiValueMap = new LinkedMultiValueMap<>();
multiValueMap.add(key, "a");
multiValueMap.add(key, "b");
multiValueMap.add(key, "c");
multiValueMap.add(key, "d");
List<String> values = multiValueMap.getValues(key);
for (String v : values) {
System.out.println(v); //结果 a b c d
}
}
}总结:
1.普通方法,原始操作、不好维护、不可复用、不可拓展 。
2.需要引入jar包。
3.对普通方法进行封装复用。推荐使用。
相关文章推荐
- JSP中用EL表达式取Map中某一个key对应的value
- 找出一个数组中重复次数最多的字符暨找出Map中的最大Value及其对应的Key
- Spring获取properties中同一个key对应的多条value的方法
- java工具类(比如一个key对应value)
- rust map的使用:获取某个key对应的value,如果不存在就插入一个
- 多个KEY值对应一个VALUE的MAP
- hibernate通过sql查询返回一个key value对应的map对象型集合
- LinkedHashMap实现分组排序(保证有序性),并实现map的一个key值对应多个value
- Map通过map.keyset或者Map.Entry遍历;map多个value对应一个key,逆向转成一个key对应一个list;通过邮编查多个地名
- MultiValueMap的用法(一个key对应多个value)
- Python根据数值大小随机返回一个key,并保证返回这个key的概率和它所对应的value成正比
- phpredis:php一个key-value用法
- php 使用数组key value 去重一个二维数组
- 集合类的一个问题,KeyValueCollection的问题
- 替换Json字符串里key对应的value值
- Explorer : 发布一个key-value存储系统,带有客户端和服务器端
- Map中根据value排序---输出value最大时所对应的Key
- java 通过map的value返回其对应的key (遍历map)
- 数据读取之key(多个字段决定一个key),value模式
- phpredis:php一个key-value扩展 简介