Map的一种用途——去重复

来源:互联网 发布:算法导论难吗 编辑:程序博客网 时间:2024/05/17 22:51

茉茉今天看到一个同事的代码里有这样一段:

public JSONArray clearRepeatJSONArray(JSONArray arrayTemp){for (int i = 0; i < arrayTemp.size(); i++) { //使用TreeMap去掉重复并排序temp.put(arrayTemp.getString(i) ,"");}//使用迭代器取出TreeMap的keySet 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取值时,要怎么返回呢


虽然想通了觉得自己好蠢萌,不过今天还是看到了一种新思路,棒棒哒

0 0