Map的一种用途——去重复

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

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取值时,要怎么返回呢


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值