如何获取ArrayList中元素出现的次数

时间:2014-12-02 15:29:06

标签: java list collections

    for(int i=0; i<arr.size(); ++i){
        oc = Collections.frequency(arr, arr.get(i));
        System.out.print(oc + " "+ arr.get(i) +" ");
        arr.remove(i);
    }

主要思想是输出序列中每个元素出现的次数。 例如

1 1 2 3 3 3 10 10

这里的输出是

2 1 1 2 3 3 2 10

它就像两个,两个元素,3个元素,3个元素和10个元素。

这是有缺陷的,例如它不适合这种情况

1 1 1 2 2 1 1 1 

有什么问题?还有其他算法吗?

4 个答案:

答案 0 :(得分:6)

问题是在for循环内部删除了一个元素(arr.remove(i)),以便其余元素被移位,当i递增时,您跳过一个元素。删除元素也会改变其频率,所以不要这样做。

做这样的事情:

List<String> arr = Arrays.asList("a", "a", "b", "a", "a");

for (String s : arr)
    System.out.println("element: " + s
        + ", count: " + Collections.frequency(arr, s));

如果元素多次出现在列表中,则会多次打印。使用HashSet记住元素是否已经打印过,不要再次打印:

List<String> arr = Arrays.asList("a", "a", "b", "a", "a");

Set<String> printed = new HashSet<>();
for (String s : arr) {
    if (printed.add(s)) // Set.add() also tells if the element was in the Set!
        System.out.println("element: " + s
            + ", count: " + Collections.frequency(arr, s));
}

<强>输出:

element: a, count: 4
element: b, count: 1

替代

或者,您可以将原始列表的所有元素添加到Set(这将确保每个元素仅包含一次),并迭代此集合,但计入原始数组:

List<String> arr = Arrays.asList("a", "a", "b", "a", "a");

for (String s : new HashSet<>(arr))
    System.out.println("element: " + s
        + ", count: " + Collections.frequency(arr, s));

输出:相同。但请注意,这可能会导致输出的顺序不同,因为Java中的Set不是有序的。

答案 1 :(得分:0)

我会使用HashMap,而意思是元素 - &gt;计数!伪:

HashMap<Integer, Integer> counts = new HashMap<Integer, Integer>();
 for(int i=0; i<arr.size(); ++i){
    Integer x = counts.get(arr.get(i));
    if (x==null) counts.put(arr.get(i), 1);
    else counts.put(arr.get(i), x+1);
}

在此之后,您的hashmap包含所有元素及其计数

答案 2 :(得分:0)

试试这个

    List a = Arrays.asList(1, 2, 1, 3, 1);
    Collections.sort(a);
    Object o = a.get(0);
    int n = 1;
    for (int i = 1; i < a.size(); i++) {
        Object t = a.get(i);
        if (o.equals(t)) {
            n++;
        } else {
            System.out.println(o + " - " + n);
            n = 1;
            o = t;
        }
    }
    System.out.println(o + " - " + n);

输出

1 - 3
2 - 1
3 - 1

答案 3 :(得分:0)

快速而聪明的方法就是这样做 1)使用Collections.sort对arrayList进行排序 2)使用indexOf()获取第一个索引,并使用lastIndexOf()方法获取最后一个索引 3)2索引的差异将给出ArrayList中给定对象的出现次数。