我是Java的新手,我正在尝试编写一个将所有元素索引从ArrayList映射到HashMap的函数,因此我可以很容易地看到重复元素的索引。
下面的代码有效,但是当我尝试使用第二个代码打印值时,它会显示完全不同的结果!
示例:
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)));
答案 0 :(得分: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]}
}
答案 1 :(得分:1)
但我不明白......我做错了什么?据我所知,我的代码与你的代码相比效率很低,但不应该做同样的事情吗?
没有。除了效率低下之外,您的版本还有一个重大错误。
让我们举例输入{60, 60, 1, 4, 5, 6, 7, 60}
。
首次迭代循环,您构建一个包含{0, 1, 7}
的列表并将其放入地图中,以便我们map containing
{60 - &gt; {0,1,7}}`
循环的第二次迭代,我们构建一个包含{1, 7}
的列表并将其放入地图中。但这当然取代60
的原始(正确)列表...我们最终得到{ 60 -> {1, 7} }
等等。简而言之,您的版本最终将生成一个地图,该地图从值映射到包含 该值的最后一个索引的列表。