所以我正在研究在数组列表中找到两个最常见元素的最佳方法的问题。
我的方法是将整个事物转换为哈希图,然后查看哪一个是最好的。因为我喜欢哈希图。他们似乎是一个很好的方法,我无法找到更好的解决方案。
除了我收到错误。这就是你进来的地方(=!
public static String[] findTwo(ArrayList<String> param) {
Map<String, Integer> counter = new HashMap<String, Integer>();
for (int i = 0; i < param.size(); i++) {
//param.get(i) is name of inserted object
if (counter.get(i) == null) {
counter.put(param.get(i), 1);
System.out.println(counter.get(i) + "<-- should be 1"); // <-- erroneous part!
} else {
counter.put(param.get(i), counter.get(i)+1);
System.out.println("elsing");
}
System.out.println(counter);
}
return null;
}
此代码打印
null<-- should be 1
{HIHI=1}
null<-- should be 1
{HIHI=1}
null<-- should be 1
{HIHI=1}
null<-- should be 1
{HIHI=1}
null<-- should be 1
{yoyo=1, HIHI=1}
null<-- should be 1
{yoyo=1, HIHI=1}
null<-- should be 1
{yoyo=1, nono=1, HIHI=1}
null<-- should be 1
{yoyo=1, nono=1, froyo=1, HIHI=1}
哪个是完全错误的!
我说插入1后该值为null。我不知道为什么会这样? =(
啊,谢谢大家!
任何人都可以帮我弄清楚时间成本是多少?
答案 0 :(得分:4)
counter.get(i) == null
应为counter.get(param.get(i))
counter(i)
编译的事实是因为Map#get
收到Object
而i
从int
自动装箱到Integer
(这是{ {1}})。
更好的方法是对Object
使用增强型for
循环迭代:
List<String> param
此外,开始直接编程面向接口而不是类实现。使用for(String parameter : param) {
if (!counter.containsKey(parameter)) {
//logic key is not present...
} else {
//logic when key is present...
}
}
支持的List
:
ArrayList
有关此内容的更多信息:
答案 1 :(得分:2)
这是问题所在。
更改以下代码行
System.out.println(counter.get(i) + "<-- should be 1");
到
System.out.println(counter.get(param.get(i)) + "<-- should be 1");
原因是,您将param.get(i)
作为计数器地图counter.put(param.get(i), 1);
的关键字并使用i
获取。所以它返回NULL
,这是正确的,因为没有值映射到键i
。