茉茉今天看到一个同事的代码里有这样一段:
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取值时,要怎么返回呢
虽然想通了觉得自己好蠢萌,不过今天还是看到了一种新思路,棒棒哒