Java 将HashMap与对象进行比较
我有一个Java 将HashMap与对象进行比较,java,hashmap,Java,Hashmap,我有一个hashmap,我想比较每个条目中的整数(值)。所以,基本上我想按照它们的Integer值降序排列我的值。我有一个比较器,它由以下部分组成 class Compare implements Comparator<Integer>{ Map<CustomObject,Integer> map; /** * Constructs our map * @param map map to be sorted. */ p
hashmap
,我想比较每个条目中的整数(值)。所以,基本上我想按照它们的Integer
值降序排列我的值。我有一个比较器
,它由以下部分组成
class Compare implements Comparator<Integer>{
Map<CustomObject,Integer> map;
/**
* Constructs our map
* @param map map to be sorted.
*/
public Compare(Map<CustomObject,Integer> map){
this.map = map;
}
/**
* Performs the comparison between two entries.
*/
public int compare(Integer one, Integer two){
if(map.get(one) <= map.get(two)){
return 1;
}else{
return 0;
}
}
}
当我运行代码时,线程“main”java.lang.ClassCastException中出现错误异常:CustomObject无法转换为java.lang.Comparable
当我试图从排序列表中提取值时,似乎调用了异常。就像这样
TreeMap<CustomObject,Integer> sorted = Tmap.putAll(hmap);
sorted.get(o);
TreeMap sorted=Tmap.putAll(hmap);
得到(o);
其中,o
是一个自定义对象
我想我误解了比较器的工作原理。。我做错了什么?如何比较这两个整数值
编辑
只是想澄清我到底想做什么
我想比较链接到CustomObject的整数。我无法将密钥设置为整数,因为这些整数可能不是唯一的。我要比较它们,因为我想根据它们的整数值按降序排列我的集合 您需要更改比较器以比较
自定义对象,而不是整数
:
class Compare implements Comparator<CustomObject>{
Map<CustomObject,Integer> map;
/**
* Constructs our map
* @param map map to be sorted.
*/
public Compare(Map<CustomObject,Integer> map){
this.map = map;
}
/**
* Performs the comparison between two entries.
*/
public int compare(CustomObject left, CustomObject right){
return map.get(left).compareTo(map.get(right));
}
}
您需要更改比较器以比较自定义对象
s,而不是整数
:
class Compare implements Comparator<CustomObject>{
Map<CustomObject,Integer> map;
/**
* Constructs our map
* @param map map to be sorted.
*/
public Compare(Map<CustomObject,Integer> map){
this.map = map;
}
/**
* Performs the comparison between two entries.
*/
public int compare(CustomObject left, CustomObject right){
return map.get(left).compareTo(map.get(right));
}
}
首先,键应该是整数,值应该是CustomObject,然后可以根据比较器对HashMap进行排序。但是默认情况下,HashMap或者如果您想在CustomObject上进行排序,那么您必须使CustomObject实现Comparable,并在其中写入compare方法,从而使HashMap基于CustomObject进行排序。如果你明白了这一点。想试试你自己试试。或者,如果你想让我举个例子来解释,我可以这样做
这个问题让人困惑。首先是键应该是整数,值应该是CustomObject,然后可以根据比较器对HashMap进行排序。但是默认情况下,HashMap或者如果您想在CustomObject上进行排序,那么您必须使CustomObject实现Comparable,并在其中写入compare方法,从而使HashMap基于CustomObject进行排序。如果你明白了这一点。想试试你自己试试。或者,如果你想让我举个例子来解释,我可以这样做
new TreeMap<..>(new Compare<..>(map))
这个问题令人困惑。newtreemap(newcompare(map))
new TreeMap<..>(new Compare<..>(map))
构建树时必须指定比较器。否则,它会假定您的密钥是可比较的(而它们不是)
但用于根据值对映射进行排序。新建树映射(新建比较(映射))
构建树时必须指定比较器。否则,它会假定您的密钥是可比较的(而它们不是)
但是,对于根据值对地图进行排序。这种方法存在一些问题
- TreeMap忽略重复项(当compareTo返回0时),在您的情况下,它只会添加递减的整数值。您可以修复它,使数字可以按任何顺序排列,但它仍然会删除任何具有重复值的条目
比较中使用的字段无法更改或将损坏集合
- 您需要知道整个键才能查找值。在本例中,您需要知道本例中的值才能进行查找,这可能不是很有用
您最好从map.entrySet()
中创建一个列表,您可以对其进行排序,因为这允许重复并且是有序的。这种方法有一些问题
- TreeMap忽略重复项(当compareTo返回0时),在您的情况下,它只会添加递减的整数值。您可以修复它,使数字可以按任何顺序排列,但它仍然会删除任何具有重复值的条目
比较中使用的字段无法更改或将损坏集合
- 您需要知道整个键才能查找值。在本例中,您需要知道本例中的值才能进行查找,这可能不是很有用
您最好从map.entrySet()
创建一个列表,您可以对其进行排序,因为这允许重复并且是有序的。我认为问题在于您使用了错误的TreeMap
构造函数。您正在使用的键要求所有键都是实现Comparable
的类的实例。您的CustomObject
没有。您应该使用接受比较器
参数的构造函数;e、 g
TreeMap<CustomObject,Integer> tmap =
new TreeMap<CustomObject,Integer>(new Compare());
即使这样也很狡猾:
- 如果映射到同一整数的任意两个
CustomObject
实例将被视为相等,并且您将无法在树映射中将这两个键都作为(不同的)键
- 如果
map
中没有one
或two
的条目,您的比较器将抛出NPE
我认为问题在于您使用了错误的
TreeMap
构造函数。您正在使用的键要求所有键都是实现Comparable
的类的实例。您的CustomObject
没有。您应该使用接受比较器
参数的构造函数;e、 g
TreeMap<CustomObject,Integer> tmap =
new TreeMap<CustomObject,Integer>(new Compare());
即使这样也很狡猾:
- 如果映射到同一整数的任意两个
CustomObject
实例将被视为相等,并且您将无法在树映射中将这两个键都作为(不同的)键
- 如果
map
中没有one
或two
的条目,您的比较器将抛出NPE
我建议使用按整数索引的多重映射。如果需要保留按对象查找这些对的功能,则可以维护这两个贴图。Java不附带多映射,但有简单的解决方案。是Map
的一个示例(向下滚动到multimaps部分)。我建议使用由in索引的multimap