黑马程序员技术交流社区
标题:
Map键值对,可不可以通过值的属性进行排序呢?
[打印本页]
作者:
李哲
时间:
2012-3-20 09:09
标题:
Map键值对,可不可以通过值的属性进行排序呢?
本帖最后由 李哲 于 2012-3-20 09:19 编辑
虽然键是唯一,而值不唯一。但是如果某map中,键值对的键和值都是唯一的,可以通过值的属性进行排序吗?
或者可以:
将map中所有的值存入到Set集合。因为Set具备迭代器。
所以可以迭代方式取出所有的值,再获取每一个值对应的键?
作者:
泮和顺
时间:
2012-3-20 09:20
可以通过2维数组来做 各自做1次交换 ..
作者:
尹震
时间:
2012-3-20 09:46
其实,用map集合中的TreeMap就可以进行自动排序,
但是,排的却是key值,若想通过值进行排序,就需要用到“比较器”,
实现Comparator接口,进行重写“compare”方法,若值是相同的,再比较键值,这样就可以进行值排序了。
所以,就算值相同也没关系。
作者:
陈汉帆
时间:
2012-3-20 14:43
技术+8?
作者:
马胜平
时间:
2012-3-20 15:18
//将Map转换为Map.Entry
Set set=map.entrySet();
//为了能让集合能按照值进行排列,这里把集合set转为Map.Entry类型的数组。
Map.Entry[] entries=(Map.Entry[]) set.toArray(new Map.Entry[set.size()] );
//按照指定的比较器和指定的排序规则对集合里的Map.Entry进行排序,这里是按照值从小到大的排序。
Arrays.sort(entries, new Comparator(){
@Override
public int compare(Object o1, Object o2) {
Integer value1=(Integer) ((Map.Entry)o1).getValue();
Integer value2=(Integer) ((Map.Entry)o2).getValue();
return value1.compareTo(value2);
}
});
复制代码
作者:
李晓旭
时间:
2012-3-20 15:28
LZ问得问题确实不错,我怎么没想到!!怪不得有8分可以加{:soso_e142:}
作者:
职业规划-刘倩老师
时间:
2012-3-20 15:33
陈汉帆 发表于 2012-3-20 14:43
技术+8?
不好意思加错了,现在已经改过来了,因为我的失误,给你添加了困惑,真是抱歉
作者:
李哲
时间:
2012-3-20 15:53
物竞天择,适者生存。
作者:
liumeng
时间:
2012-3-20 16:15
public class TreeSet1 {
public static void main(String[] args) {
Map map=new HashMap();
map.put("ggw",2);
map.put("asdf",1);
//将Map转换为Map.Entry
Set set=map.entrySet();
TreeSet ts=new TreeSet(new Comparator(){
@Override
public int compare(Object o1, Object o2) {
Integer value1=(Integer) ((Map.Entry)o1).getValue();
Integer value2=(Integer) ((Map.Entry)o2).getValue();
return value1.compareTo(value2);
}});
ts.addAll(set);
Iterator ti=ts.iterator();
while(ti.hasNext())
{
System.out.println(((Map.Entry)ti.next()).getValue());
}
}
}
作者:
李飞
时间:
2012-3-20 17:41
1. 首先map集合的TreeMap就可以进行排序,是对键的排序
2. 如果要自定义排序的话,首先将取集合元素,由于map集合是双序列集合,
1)通过keySet()取出集合所有的键,对应Set集合,遍历Set集合取出key对应的value
2)通过entrySet()取出键值映射的关系,对应Set集合,遍历Set集合,取得键和值,当我们需要对TreeSet集合中的元素不具备比较功能,或是比较功能不适合时,需要让集合自身有比较性。这时就需要自定义一个比较器。
3. 其实这个时候就是对Set集合的排序了,而Set集合:TreeSet和HashSet两个了
TreeSet集合自定义比较:
1)集合元素自身具备比较性,集合元素类实现Comparable接口,compareTo方法,提供自然排序方法
2)集合具备比较性。比较器,实现Comparator接口,compare方法。
当有比较器的时候,以比较器为主
HashSet集合自定义比较:
我们要重写hashCode()和equals()方法,hashCode()用来判断集合元素对象,而equals()用来判断元素对象的属性值是否相同
而且都要重写toString方法
作者:
lucky_xingxing
时间:
2012-3-20 19:43
LinkedHashMap会按照存入的顺序进行排序的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2