Map的一种用途——去重复
2015-12-12 10:21
253 查看
茉茉今天看到一个同事的代码里有这样一段:
通过将JSONArray中的各JSON对象循环赋给一个Map作为Key值,来去除JSON数组中的重复值。
不知道有没有人和我一样是非计算机专业入了这行的,没有学过数据结构这门课,自学的,掌握的不太好,看着这段硬是没明白为什么可以这样做。
不过,没关系,先写了个实验程序:
控制台输出结果:
2
key:child1 value:test1
key:child2 value:test2
可以看出:在向child1键第二次放入值时,覆盖了第一次放入的值(蠢蠢的茉茉还用HashMap又试了遍,结果一样)
看Jdk中的源码:
TreeMap的put方法是这样的:
在May中,一个Key只会出现一次。
想想也是哎,如果可以有同名的Key,再get方法用key取值时,要怎么返回呢
虽然想通了觉得自己好蠢萌,不过今天还是看到了一种新思路,棒棒哒
public JSONArray clearRepeatJSONArray(JSONArray arrayTemp){ for (int i = 0; i < arrayTemp.size(); i++) { //使用TreeMap去掉重复并排序 temp.put(arrayTemp.getString(i) ,""); } //使用迭代器取出TreeMap的key Set set = temp.keySet(); Iterator iter = set.iterator(); while (iter.hasNext()) { array.add(iter.next()); } return array; }
通过将JSONArray中的各JSON对象循环赋给一个Map作为Key值,来去除JSON数组中的重复值。
不知道有没有人和我一样是非计算机专业入了这行的,没有学过数据结构这门课,自学的,掌握的不太好,看着这段硬是没明白为什么可以这样做。
不过,没关系,先写了个实验程序:
package test; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.TreeMap; public class test { public static void main(String[] args) { Map<String, String> map=new TreeMap<String,String>(); map.put("child1", "test1"); map.put("child1", "test2"); map.put("child2", "test1"); System.out.println(map.size()); Set<Entry<String,String>> set=map.entrySet(); Iterator<Entry<String,String>> iterator=set.iterator(); while (iterator.hasNext()) { Entry<String,String> entry = iterator.next(); System.out.println("key:"+entry.getKey()+" value:"+entry.getValue()); } } }
控制台输出结果:
2
key:child1 value:test1
key:child2 value:test2
可以看出:在向child1键第二次放入值时,覆盖了第一次放入的值(蠢蠢的茉茉还用HashMap又试了遍,结果一样)
看Jdk中的源码:
TreeMap的put方法是这样的:
public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { compare(key, key); // type (and possibly null) check root = new Entry<>(key, value, null); size = 1; modCount++; return null; } int cmp; Entry<K,V> parent; // split comparator and comparable paths Comparator<? super K> cpr = comparator; if (cpr != null) { do { parent = t; cmp = cpr.compare(key, t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null); } else { if (key == null) throw new NullPointerException(); Comparable<? super K> k = (Comparable<? super K>) key; do { parent = t; cmp = k.compareTo(t.key); if (cmp < 0) t = t.left; else if (cmp > 0) t = t.right; else return t.setValue(value); } while (t != null); } Entry<K,V> e = new Entry<>(key, value, parent); if (cmp < 0) parent.left = e; else parent.right = e; fixAfterInsertion(e); size++; modCount++; return null; }put方法会遍历TreeMap,如果配到一个节点的Key值与要加入的Key相同,会将要存入的值放在该节点上,覆盖原来的值
在May中,一个Key只会出现一次。
想想也是哎,如果可以有同名的Key,再get方法用key取值时,要怎么返回呢
虽然想通了觉得自己好蠢萌,不过今天还是看到了一种新思路,棒棒哒
相关文章推荐
- Daily Scrum 12.11
- HDU 5311:Hidden String【字符串】
- modelism写入txt
- 关于后缀数组的倍增算法和height数组
- 免费的编程中文书籍索引
- jQuery Validate初步体验(二)
- HDU 1038 求路程与速度 (单位转换)
- 九度1531-货币面值问题
- hdu 5073 Galaxy(2014acm鞍山亚洲分部 C)
- 【菜鸟学Java】5:“徒手”创建一个Web应用
- svn Tortoise安装、使用说明
- LSB 简介
- lesson 4 Show Messages in Messagebox
- thinkphp基于角色的权限控制详解
- LeetCode 240 Search a 2D Matrix II
- 触发器的使用
- 【UML】之活动图
- 23种设计模式全解析
- QImage 图像格式小结
- 损失函数