黑马程序员技术交流社区
标题:
TreeMap 怎么用值排序
[打印本页]
作者:
why168
时间:
2014-2-20 00:10
标题:
TreeMap 怎么用值排序
TreeMap 怎么用值排序
下面代码 是用键排序的!想用值排序,不知道哪位大神有好的想法。
public class CiShu {
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(Founction("aaasdfasdgaa"));
}
public static String Founction(String s)
{
char[] arr=s.toCharArray();
TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>();
int count=0;
for(char c:arr)
{
Integer value=tm.get(c);
if(value!=null)
count=value;
count++;
tm.put(c, count);
count=0;
}
Set<Map.Entry<Character,Integer>> entrySet=tm.entrySet();
Iterator<Map.Entry<Character,Integer>> it=entrySet.iterator();
StringBuilder sb=new StringBuilder();
while(it.hasNext())
{
Map.Entry<Character, Integer> me=it.next();
sb.append(me.getKey()+":"+me.getValue());
}
return sb.toString();
}
}
作者:
奋斗的小胖子
时间:
2014-2-20 09:10
这个我用值排序试过了,不怎么好搞,就collection 接口的 values()方法。这个估计只能用遍历的方法,看值是否相同,然后把对应的键与值打印出来吧。
这个看看其他人有什么好的办法,我也学习学习。
作者:
何苦似梦离
时间:
2014-2-20 09:28
你这是有反常理,即使实现用值排序,但是有什么什么用,那TreeMap判断元素唯一性就会用值来,映射表存在意义是什么?,键值键值,你这样做不就是键就是值,值就是键,毫无意义.当你做这个的时候一定想清楚为什么要做.?思考,思考,学会思考.
作者:
why168
时间:
2014-2-20 09:56
何苦似梦离 发表于 2014-2-20 09:28
你这是有反常理,即使实现用值排序,但是有什么什么用,那TreeMap判断元素唯一性就会用值来,映射表存在意 ...
谢谢你的回复,同时你非常感谢你的提醒。只是技术上的探讨。Think out of the box,乔布斯也曾说过:年轻人敢于打破常规才能成功。当然我的意思并不是实际工作中要用值排序。如果你能给出解决方案,那是极好的。道理这玩意.........
作者:
奋斗的小胖子
时间:
2014-2-20 10:01
何苦似梦离 发表于 2014-2-20 09:28
你这是有反常理,即使实现用值排序,但是有什么什么用,那TreeMap判断元素唯一性就会用值来,映射表存在意 ...
不错啊,想得这么深,再说说啊。让我多学习点,你倒是给了我一个答案啊。当时候我就一直纳闷了,为什么有getkey方法而没有getvalues方法进行操作
作者:
李金中
时间:
2014-2-20 16:01
本帖最后由 李金中 于 2014-2-20 16:03 编辑
public class TreeMapTest {
public static void main(String[] args)
{
TreeMap<String, Integer> tr = new TreeMap();
tr.put("a", 3);
tr.put("b", 5);
tr.put("c", 4);
tr.put("d", 2);
Set<Map.Entry<String, Integer>> setMap = tr.entrySet();
//打印按键排序的结界
for(Map.Entry temp : setMap)
{
System.out.println(temp.getKey() + ":" + temp.getValue());
}
System.out.println("=================");
int size = tr.size();
MapSort<String, Integer>[] mapSortArr = new MapSort[size];
int index = 0;
for(Map.Entry<String, Integer> temp : setMap)
{
mapSortArr[index] = new MapSort(temp.getKey(), temp.getValue());
index++;
}
//对值进行插入排序
for(index = 1; index < size; index++)
{
int i = index - 1;
Integer keyVal = mapSortArr[index].val;
String keyString = mapSortArr[index].key;
while((i >= 0) && ((mapSortArr.val).compareTo(keyVal) == 1))
{
mapSortArr[i + 1].key = mapSortArr.key;
mapSortArr[i + 1].val = mapSortArr.val;
i--;
}
mapSortArr[i + 1].key = keyString;
mapSortArr[i + 1].val = keyVal;
}
//打印按值排序后的结果。
for(MapSort mTemp : mapSortArr)
{
System.out.println(mTemp.key + ":" + mTemp.val);
}
}
}
class MapSort<K, V>
{
public K key;
public V val;
MapSort(K key, V val)
{
this.key = key;
this.val = val;
}
}
稍微实现了下,我觉得值得考虑,就试着写了下,看看OK不。
作者:
hdsjsql
时间:
2014-2-20 21:36
本帖最后由 hdsjsql 于 2014-2-20 21:39 编辑
可以先静态定义一个以键排序的TreeMap tm,并在静态代码块中加入元素
然后再定义一个TreeMap tm1 ,指定构造器,以值排序。
再将tm映射关系复制tm1中
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
public class ValueSort {
//静态定义一个TreeMap,以键的自然顺序排序
public static TreeMap<String,Integer> tm =
new TreeMap<String,Integer>();
static{
tm.put("lisi",21);
tm.put("zhangshan",27);
tm.put("wangwu",15);
tm.put("zhaoliu",23);
}
public static void main(String[] args) {
//另外定义一个TreeMap,指定比较器,以值排序
TreeMap<String,Integer> tm1 =
new TreeMap<String,Integer>(new StuNameComparator());
//将tm的映射关系全部复制放入tm1中
tm1.putAll(tm);
Set<String> keySet = tm1.keySet();
Iterator<String> it = keySet.iterator();
while(it.hasNext()){
String name = it.next();
Integer age = tm1.get(name);
System.out.println(name+":"+age);
}
}
//获取tm中的value值
public static Integer getValue(String name){
return tm.get(name);
}
}
class StuNameComparator implements Comparator<String>{
// 定义以值排序的比较器
@Override
public int compare(String o1, String o2) {
Integer x = ValueSort.getValue(o1);
Integer y = ValueSort.getValue(o2);
return x.compareTo(y);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2