【问题标题】:HashMap wrong values for keysHashMap 的键值错误
【发布时间】:2014-03-16 10:53:08
【问题描述】:

我对 Java 有点陌生,我正在尝试编写一个函数,将 ArrayList 中的所有元素索引映射到 HashMap,因此我可以轻松查看重复元素的索引。

下面的代码有效,但是当我尝试使用第二个 for 打印值时,它显示的结果完全不同!

例子:

60 [40, 64]

第二个是什么节目

60 [64]

更多数字

60 [64]

HashMap<Integer,ArrayList<Integer>> table= new HashMap<Integer,ArrayList<Integer>>();

//checking all items in an ArrayList a 
//and putting their index in a hashTable
for(int i=0; i<a.size(); i++){

        ArrayList<Integer> indexes = new ArrayList<Integer>();
        indexes.add(i);

        for(int j=i+1; j<a.size(); j++){

            //are the items equal?
            if(a.get(j).equals(a.get(i))){
                indexes.add(j);
            }       

        }
        //put in the HashMap
        table.put(a.get(i), indexes);
        System.out.println(a.get(i) + " " +table.get((a.get(i))));

    }
   //shows completely different results!
    for(int ix=1;ix<table.size();ix++)
        System.out.println(a.get(ix) + " " +table.get(a.get(ix)));

【问题讨论】:

  • 我不确定我是否理解您要完成的工作,因为单个 ArrayList 的索引始终为 [0, list.size() - 1]。您能具体说明您要达到的目标吗?
  • 我正在尝试映射 ArrayList 中所有元素的索引,以便我可以轻松查看重复元素的索引
  • ArrayList 就像一个常规数组,第一个索引是 0,最后一个索引是 (size - 1)。您没有任何重复的索引。
  • 明白,但如果我有 {60,60,1,4,5,6,7,60} ,我应该在 HashMap 60 [0,1,8]
  • 您想要一个HashMap,其中您的 Arraylist 的唯一值作为键,并将相应键的索引保存在 Arraylist 中作为值?

标签: java hashmap key key-value


【解决方案1】:

试试这个:

public static void main(String[] args) {
    List<Integer> input = Arrays.asList(60, 60, 1, 4, 5, 7, 60);

    Map<Integer, List<Integer>> result = new HashMap<>();

    for (int n = 0; n < input.size(); ++n) {
        List<Integer> list = result.get(input.get(n));

        if (list != null) {             
            list.add(n);
        } else {
            list = new ArrayList<>();
            list.add(n);
            result.put(input.get(n), list);
        }
    }

    System.out.println(result); // prints {1=[2], 4=[3], 5=[4], 7=[5], 60=[0, 1, 6]}
}

【讨论】:

  • 它...有效!谢谢!!!但我不明白......我做错了什么?据我所知,我的代码与你的相比确实效率低下,但它不应该做同样的事情吗?
【解决方案2】:

但我不明白...我做错了什么?据我所知,我的代码与你的相比确实效率低下,但它不应该做同样的事情吗?

嗯,不。除了效率低下,您的版本还有一个重大错误。

让我们以您的示例输入{60, 60, 1, 4, 5, 6, 7, 60}

第一次迭代循环,您构建一个包含{0, 1, 7} 的列表并将其放入地图中,这样我们就有了map containing{ 60 -> {0, 1, 7} }`

循环的第二次迭代,我们构建一个包含{1, 7} 的列表并将其放入地图中。但这当然取代了60 的原始(正确)列表......我们最终得到{ 60 -&gt; {1, 7} }

等等。简而言之,您的版本最终会生成一个映射,该映射从值映射到包含 该值的最后一个索引的列表。

【讨论】:

  • 我明白了。感谢您的解释!
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2012-05-17
相关资源
最近更新 更多