ArrayList到HashMap的功能很奇怪

时间:2013-11-05 04:00:04

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

啊,谢谢大家!

任何人都可以帮我弄清楚时间成本是多少?

2 个答案:

答案 0 :(得分:4)

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

counter(i)编译的事实是因为Map#get收到Objectiint自动装箱到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