Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将HashMap与对象进行比较_Java_Hashmap - Fatal编程技术网

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