0

因此,我正在研究在数组列表中查找两个最常见元素的最佳方法的问题。

我的方法是将整个东西变成一个hashmap,然后看哪个是最大的。因为我喜欢哈希图。他们似乎是一个很好的方法,我无法想出更好的解决方案。

除了我得到一个错误。这是你进来的地方(=!

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。我不知道为什么会这样?=(

啊啊啊谢谢大家!

谁能帮我弄清楚时间成本是多少?

4

2 回答 2

4

counter.get(i) == null应该counter.get(param.get(i))

counter(i)编译的事实是因为Map#get接收到Object并从toi自动装箱(这是 an )。intIntegerObject

更好的方法是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

public static String[] findTwo(List<String> param) {
    //...
}

更多信息:

于 2013-11-05T04:02:10.363 回答
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的是 true,因为 key 没有映射值i

于 2013-11-05T04:06:42.700 回答