黑马程序员技术交流社区
标题:
关于比较器问题
[打印本页]
作者:
李罡
时间:
2013-3-18 09:29
标题:
关于比较器问题
本帖最后由 李罡 于 2013-3-18 18:54 编辑
import java.util.*;
class CharComparator implements Comparator<Zimu>
{
public int compare(Zimu z1,Zimu z2)
{
return new Character(z1.getName()).compareTo(new Character(z2.getName()));
}
}
class Zimu
{
private char z;
Zimu(char z)
{
this.z=z;
}
public char getName()
{
return z;
}
}
class MapTest3
{
public static void main(String[] args)
{
String s= charCount("ak+abAf1c,dCkaAbc-defa");
System.out.println(s);
}
public static String charCount(String str)
{
char[] chs = str.toCharArray();
TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(new CharComparator());//为什么这里加个比较器就不行了
int count = 0;
for(int x=0; x<chs.length; x++)
{
if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
continue;
Integer value = tm.get(chs[x]);
if(value!=null)
count = value;
count++;
tm.put(chs[x],count);//
count = 0;
}
//System.out.println(tm);
StringBuilder sb = new StringBuilder();
Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Character,Integer> me = it.next();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
}
加了比较器以后,显示:
错误: 对于TreeMap(CharComparator), 找不到合适的构造器
TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(n
ew CharComparator());
老师写的代码中是没有加比较器的,运行没问题的。可为什么我加了比较器以后编译就无法通过
了呢?比较器该怎么加呢?
另外可以说说hashset和treeset,compare和compareTo的区别吗
复制代码
作者:
android2050
时间:
2013-3-18 10:16
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
class CharComparator implements Comparator<Zimu>
{
public int compare(Zimu z1,Zimu z2)
{
return new Character(z1.getName()).compareTo(new Character(z2.getName()));
}
}
class Zimu
{
private char z;
Zimu(char z)
{
this.z=z;
}
public char getName()
{
return z;
}
}
class MapTest3
{
public static void main(String[] args)
{
String s= charCount("ak+abAf1c,dCkaAbc-defa");
System.out.println(s);
}
public static String charCount(String str)
{
char[] chs = str.toCharArray();
TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>(new CharComparator());//为什么这里加个比较器就不行了
// 因为类TreeMap中没有该构造方法
int count = 0;
for(int x=0; x<chs.length; x++)
{
if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
continue;
Integer value = tm.get(chs[x]);
if(value!=null)
count = value;
count++;
tm.put(chs[x],count);//
count = 0;
}
//System.out.println(tm);
StringBuilder sb = new StringBuilder();
Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Character,Integer> me = it.next();
Character ch = me.getKey();
Integer value = me.getValue();
sb.append(ch+"("+value+")");
}
return sb.toString();
}
}
复制代码
作者:
李罡
时间:
2013-3-18 10:29
陈团辉 发表于 2013-3-18 10:16
还是运行不了啊
作者:
谢洋
时间:
2013-3-18 16:25
本帖最后由 谢洋 于 2013-3-18 16:32 编辑
对不起,弄错了,你所看到的贴子不存在
作者:
谢洋
时间:
2013-3-18 16:31
上面是直接Copy API文档出现的恶果,偷懒要不得删不掉啊,
TreeMap(Comparator<? super K> comparator)
TreeMap(Map<? extends K,? extends V> m)
先解说下上面的API文档:
Comparator<? super K> comparator //表示该比较器要比较的泛型实参
是K(键)类
或其父类,
你的键是TreeMap<Character,Integer>中的Character,也就是说,你自定义的比较器的泛型实参必须是Character类型或者Character的父类;
但是你下定义的比较器是的泛型实参是:Zimu;那么在存入过程中,是拿Character类参传给compare(Zimu z1,Zimu z2)中的Zimu类型进行比较,
第二个构造不用说了吧,
你下面是你的比较器
class CharComp implements
Comparator<Zimu>
{
public int compare(
Zimu z1,Zimu z2
)
{
return new Character(z1.getName()).compareTo(new Character(z2.getName()));
}
}
作者:
陈丽莉
时间:
2013-3-18 18:06
若还有问题,请继续追问,没有的话,请将帖子分类改成【已解决】~
作者:
李罡
时间:
2013-3-18 18:54
谢洋 发表于 2013-3-18 16:31
上面是直接Copy API文档出现的恶果,偷懒要不得删不掉啊,
TreeMap(Comparator
谢谢!我已经想明白了!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2