删除Map中Value重复的记录,并且只保留Key最小的那条记录

介绍

晚上无聊的时候,我做了一个测试题,测试题的大体意思是:删除Map中Value重复的记录,并且只保留Key最小的那条记录。

例如:

I have a map with duplicate values:

("A", "1");

("B", "2");

("C", "2");

("D", "3");

("E", "3");

I would like to the map to have:

("A", "1");

("B", "2");

("D", "3");

package shuai.study.map;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;

/**
 * @author shengshu
 *
 */
public class UniqueMap {

	// Remove repetition from Map, this is core part in this Class
	public static Map<String, String> removeRepetitionFromMap(Map<String, String> map) {
		Set<Entry<String, String>> set = map.entrySet();

		List<Entry<String, String>> list = new ArrayList<Entry<String, String>>(set);

		Collections.sort(list, new Comparator<Entry<String, String>>() {
			@Override
			public int compare(Entry<String, String> entry1, Entry<String, String> entry2) {
				return Integer.valueOf(entry1.getValue().hashCode()) - Integer.valueOf(entry2.getValue().hashCode());
			}
		});

		// list.size() is dynamic change
		for (int index = 0; index < list.size(); index++) {
			String key = list.get(index).getKey();
			String value = list.get(index).getValue();

			int next_index = index + 1;

			if (next_index < list.size()) {
				String next_key = list.get(next_index).getKey();
				String next_value = list.get(next_index).getValue();

				// Remove repetition record whose key is more bigger
				if (value == next_value) {
					if (key.hashCode() < next_key.hashCode()) {
						map.remove(next_key);
						list.remove(next_index);
					} else {
						map.remove(key);
						list.remove(index);
					}

					// Due to removing repetition in List, so index will be reduced
					index--;
				}
			}
		}

		return map;
	}

	// Transfer Map to Sorted Map
	public static Map<String, String> transferToSortedMap(Map<String, String> map) {
		// Define comparator for TreeMap
		Map<String, String> new_sort_map = new TreeMap<String, String>(new Comparator<String>() {
			@Override
			public int compare(String key1, String key2) {
				return key1.hashCode() - key2.hashCode();
			}
		});

		new_sort_map.putAll(map);

		return new_sort_map;
	}

	public static void printMap(Map<String, String> map) {
		Iterator<Entry<String, String>> iterator = map.entrySet().iterator();

		while (iterator.hasNext()) {
			Entry<String, String> entry = iterator.next();

			String key = entry.getKey();
			String value = entry.getValue();

			System.out.println(key + " --> " + value);
		}
	}

	public static void main(String[] args) {
		Map<String, String> map = new HashMap<String, String>();
		map.put("A", "1");
		map.put("B", "2");
		map.put("C", "2");
		map.put("D", "3");
		map.put("E", "3");

		Map<String, String> new_map = UniqueMap.removeRepetitionFromMap(map);

		// new_sort_map is what we want
		Map<String, String> new_sort_map = UniqueMap.transferToSortedMap(new_map);

		// Print new_sort_map
		UniqueMap.printMap(new_sort_map);
	}
}

删除Map中Value重复的记录,并且只保留Key最小的那条记录

时间: 2024-10-26 01:17:41

删除Map中Value重复的记录,并且只保留Key最小的那条记录的相关文章

【方法2】删除Map中Value重复的记录,并且只保留Key最小的那条记录

根据guigui111111的建议:先把Map按Key从大到小排序,然后再把Key和Value互换.这也是一种很好的思路,我写了一下代码,顺便贴上来,供大家参考与分享. package shuai.study.map; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import j

【方法3:Perl版本】删除Map中Value重复的记录,并且只保留Key最小的那条记录

icemouse210写了一个Perl版本的,发挥了脚本高度封装的优势.我把代码贴出来,供大家参考分享. #!/user/bin/perl -w use English; use strict; use warnings; my %test_hash=( "A" => '1', "B" => '2', "C" => "2", "D" => "3", "E

【方法1】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录

介绍 晚上无聊的时候,我做了一个測试题,測试题的大体意思是:删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录. 比如: I have a map with duplicate values: ("A", "1"); ("B", "2"); ("C", "2"); ("D", "3"); ("E", "

【方法2】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录

依据guigui111111的建议:先把Map按Key从大到小排序,然后再把Key和Value互换.这也是一种非常好的思路,我写了一下代码,顺便贴上来,供大家參考与分享. package shuai.study.map; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import

删除oracle 表中重复数据sql语句、保留rowid最小的一条记录

delete from tablename a where rowid > ( select min(rowid) from table_name b where b.id = a.id and b.name=a.name);

初探oracle删除重复记录,只保留rowid最小的记录

如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种方法,如下只是介绍了两种方法(exist和in两种). 1.首先创建一个测试表. create table my_users( id number, username varchar2(20), sal number ) 2.插入测试数据 begin for i in 1..10 loop insert into my_users values(i,'carl

oracle删除一个表中的重复数据,且只保留一条

例子1:查找一个表中的重复数据,重复记录是根据单个字段(Id)来判断,表名为STUDENT SELECT ID , COUNT(1) FROM STUDENT T GROUP BY T.ID HAVING COUNT(ID) > 1 例子2:删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录,表名为STUDENT DELETE FROM STUDENT WHERE ID IN (SELECT ID FROM STUDENT T GROUP BY T.ID H

删除重复数据,只保留ID最小的一条数据

最近遇到一个问题,就是使用的rm_user_department的重复数据过多,需要删除重复数据,在网上找的sql,照着写的基本上运行都有错误,现在将自己写的贴出来给大家看看. rm_user_department 的表结构如图: select * from rm_user_department DELETE FROM rm_user_department --这里不能使用别名,如果使用别名会报错 WHERE ( user_id, dep_id, user_type ) IN ( select

Map去重,去重value相同的元素,保留key最小的那个值

Map<Integer,String>,Integer代表时间撮,String代表文本信息去重函数:就是删除Map中value相同的元素,只保留key最小的那个元素 public static Map<Integer,String> RemoveRepFromMap(Map<Integer,String> map){ Set<Entry<Integer,String>> set = map.entrySet(); List<Entry<