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会在运行时擦除对象
的泛型。如果您的列表
仅包含单一类型的对象(或该类型的子对象),请使用泛型!