我的问题如下。我有一个整数的arraylist。 arraylist包含5个整数,例如[5,5,3,3,9]或者[2,2,2,2,7]。许多arraylists有重复的值,我不确定如何计算每个值存在多少。
问题是如何在arraylist中找到重复值并计算有多少特定副本。在第一个例子[5,5,3,3,9]中有2个5和2个。 [2,2,2,2,7]的第二个例子只有4 2。我希望找到的结果信息是,如果有任何重复,那么它们有多少以及重复了哪个特定的整数。
我不太确定如何在java中执行此操作。
非常感谢任何帮助。感谢。
答案 0 :(得分:6)
对我而言,最简单的答案是使用Collections.frequency
方法。有点像这样:
// Example ArrayList with Integer values
ArrayList<Integer> intList = new ArrayList<Integer>();
intList.add(2);
intList.add(2);
intList.add(2);
intList.add(2);
intList.add(7);
Set<Integer> noDupes = new HashSet<Integer>();
noDupes.addAll(intList); // Remove duplicates
for (Integer i : noDupes) {
int occurrences = Collections.frequency(intList, i);
System.out.println(i + " occurs " + occurrences + " times.");
}
如果您愿意,可以将每个Integer
与其出现次数进行映射:
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (Integer i : noDupes) {
map.put(i, Collections.frequency(intList, i));
}
答案 1 :(得分:5)
我想到了两种算法。
对其进行排序(Collections.sort
)。然后通过轻松找到傻瓜进行迭代。
通过保持Map<Integer,Integer>
(或Map<Integer,AtomicInteger>
可变计数)进行迭代。这样有点难看。
无论哪种方式,编码它应该是一个有益的练习。我建议同时进行比较。
答案 2 :(得分:3)
这是一个具体的实现,通过测试,我在评论中描述了@Tom的回答:
package playground.tests;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import junit.framework.TestCase;
public class DupeCounterTest extends TestCase {
public void testCountDupes() throws Exception {
int[] array = new int[] { 5, 5, 3, 3, 9 };
assertEquals("{3=2, 5=2}", countDupes(array).toString());
}
private Map<Integer, AtomicInteger> countDupes(int[] array) {
Map<Integer, AtomicInteger> map = new HashMap<Integer, AtomicInteger>();
// first create an entry in the map for every value in the array
for (int i : array)
map.put(i, new AtomicInteger());
// now count all occurrences
for (int i : array)
map.get(i).addAndGet(1);
// now get rid of those where no duplicate exists
HashSet<Integer> discards = new HashSet<Integer>();
for (Integer i : map.keySet())
if (map.get(i).get() == 1)
discards.add(i);
for (Integer i : discards)
map.remove(i);
return map;
}
}
答案 3 :(得分:1)
除数组列表
外,还使用Hashmap集合将收集这些值的数组列表转移到hashmap中,当前一个键不存在时添加一个新项,并将已存在的键值增加1。然后迭代Hashmap并打印出值为&gt;的任何键。 1。
答案 4 :(得分:1)
您可以浏览List
并将其放入Map
计数器中。然后很容易找出哪一个是重复的。
答案 5 :(得分:0)
为了更清晰地抽象您正在做的事情,您可以使用Multiset / guava中的google-collections数据结构。您甚至可能会发现您宁愿使用它而不是List
,这取决于您正在使用它(如果您不需要列表的确定性排序)。你会这样使用它:
Multiset<Integer> multiset = HashMultiset.create(list);
int count = multiset.count(3); // gets the number of 3s that were in the list
就上述内容的内容而言,它几乎完全等同于根据您的列表构建Map<Integer,AtomicInteger>
的建议。