Java-如何将列表类型传递给HashMap?

Java-如何将列表类型传递给HashMap?,java,Java,我试图创建一个方法public static Object getmostoccuringobject(List List),该方法应返回给定列表中出现次数最多的对象,如果有多个出现次数最多的对象,则返回null 为了实现这一点,我需要使用一个HashMap,列表中的对象作为键,该对象的频率作为值:HashMap 这就是我想到的: public static <T> T getMostOccuringObject(List<T> list) { HashMap&l

我试图创建一个方法
public static Object getmostoccuringobject(List List)
,该方法应返回给定列表中出现次数最多的对象,如果有多个出现次数最多的对象,则返回null

为了实现这一点,我需要使用一个HashMap,列表中的对象作为键,该对象的频率作为值:
HashMap

这就是我想到的:

public static <T> T getMostOccuringObject(List<T> list) {
    HashMap<T, Integer> map = new HashMap<>();
    for (T item : list) {
        if (map.containsKey(item)) {
            map.put(item, map.get(item) + 1);
        } else {
            map.put(item, 1);
        }
    }
    int max = Collections.max(map.values());
    if (Collections.frequency(map.values(), max) == 1) {
        for (T object : map.keySet()) {
            if (map.get(object).equals(max)) {
                return object;
            }
        }
    }
    return null;
}
publicstatict getMostOccuringObject(列表){
HashMap=newHashMap();
对于(T项:列表){
if(地图容器(项目)){
map.put(项目,map.get(项目)+1);
}否则{
地图放置(第1项);
}
}
int max=Collections.max(map.values());
if(Collections.frequency(map.values(),max)==1){
对于(T对象:map.keySet()){
if(map.get(object.equals)(max)){
返回对象;
}
}
}
返回null;
}

但我不确定这是否能满足我的要求。代码不会编译。有人能帮我确认一下这是否有效,如果无效,我如何才能使其有效?

通过使用通配符
作为
地图的键,将无法添加任何元素;
Map#put
方法需要一个捕获类型,当您尝试向其中添加任何
对象时,它将不会编译。相反,您可以使用通用的:

public static <T> T getMostOccuringObject(List<T> c) {
    Map<T, Integer> frequency = new HashMap<>();
    // rest of the code
}
publicstatict getMostOccuringObject(列表c){
映射频率=新HashMap();
//代码的其余部分
}

使用通配符
作为
地图的键,将无法添加任何元素;
Map#put
方法需要一个捕获类型,当您尝试向其中添加任何
对象时,它将不会编译。相反,您可以使用通用的:

public static <T> T getMostOccuringObject(List<T> c) {
    Map<T, Integer> frequency = new HashMap<>();
    // rest of the code
}
publicstatict getMostOccuringObject(列表c){
映射频率=新HashMap();
//代码的其余部分
}

以下内容适合您。还要确保参数应该有合适的hashcode&equals方法

public static <T> Object getMostOccuringObject(List<T> c) {
HashMap<T, Integer> frequency = new HashMap<>();
// rest of the code
公共静态对象getMostOccuringObject(列表c){
HashMap频率=新HashMap();
//代码的其余部分
}

参考:
以下内容适合您。还要确保参数应该有合适的hashcode&equals方法

public static <T> Object getMostOccuringObject(List<T> c) {
HashMap<T, Integer> frequency = new HashMap<>();
// rest of the code
公共静态对象getMostOccuringObject(列表c){
HashMap频率=新HashMap();
//代码的其余部分
}

参考:

您的意思是说,这是否会编译(您当然可以自己测试),或者您是否可以用这样的哈希映射解决这个问题(对于哈希映射,简单的“yes,it will work”(是的,它会工作)对您没有帮助,因为您需要弄清楚如何从那里开始),但是我不确定HashMap是否与列表具有相同的类型。没有理由使用通配符
而不是类型。还有一个陷阱,就是列表中的对象必须正确地实现了hashcode/equals方法,否则每个项的频率为1。对于这个问题,您不需要使用
HashMap
。@JoeC我已经更新了代码。否则你会怎么做?(没有Java 8)你的意思是说,如果这将编译(你肯定可以自己测试),或者如果你可以用这样一个HashMap解决这个问题(简单的“yes,it will work”将对你没有帮助,因为你需要弄清楚如何从那里开始编译)?代码确实编译,但是我不确定HashMap是否与列表具有相同的类型。没有理由使用通配符
而不是类型。还有一个陷阱,就是列表中的对象必须正确地实现了hashcode/equals方法,否则每个项的频率为1。对于这个问题,您不需要使用
HashMap
。@JoeC我已经更新了代码。否则你会怎么做?(没有Java8)实际上,泛型类型是必须的;否则,
列表c
中的元素不能作为键插入
映射频率
,而不进行未经检查的类型转换。我是否也可以使用对象作为类型而不是泛型类型,因为我已经返回了一个对象?@Izruo我甚至认为显式转换不会修复它,因为
Map@HYBR1D但是为什么要返回对象呢,是否可以返回与列表相同的类型?如果我调用
getMostOccuringObject(stringList)
,我希望得到一个
字符串
,而不是
对象
@HYBR1D Type erasure会在运行时擦除
对象
的泛型。如果您的
列表
仅包含单一类型的对象(或该类型的子对象),请使用泛型!实际上,泛型类型是必须的;否则,
列表c
中的元素不能作为键插入
映射频率
,而不进行未经检查的类型转换。我是否也可以使用对象作为类型而不是泛型类型,因为我已经返回了一个对象?@Izruo我甚至认为显式转换不会修复它,因为
Map@HYBR1D但是为什么要返回对象呢,是否可以返回与列表相同的类型?如果我调用
getMostOccuringObject(stringList)
,我希望得到一个
字符串
,而不是
对象
@HYBR1D Type erasure会在运行时擦除
对象
的泛型。如果您的
列表
仅包含单一类型的对象(或该类型的子对象),请使用泛型!