如何在arraylist中找到相同整数的倍数?

时间:2010-04-29 22:38:09

标签: java loops integer arraylist

我的问题如下。我有一个整数的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中执行此操作。

非常感谢任何帮助。感谢。

6 个答案:

答案 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键是唯一的数组int值和
  • 键的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>的建议。