有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

    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

它就像两个1,一个元素是2,三个元素是3,两个元素是10

例如,这是buggy,它不适用于本案例

1 1 1 2 2 1 1 1 

怎么了?还有其他算法吗


共 (4) 个答案

  1. # 1 楼答案

    快速而聪明的方法是 1) 使用集合对arrayList进行排序。分类 2) 使用indexOf()获取第一个索引,使用lastIndexOf()方法获取最后一个索引 3) 索引差为2将给出给定对象在ArrayList中的出现次数

  2. # 2 楼答案

    我将使用HashMap,而其含义是元素->;计数伪:

    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将保存所有元素及其计数

  3. # 3 楼答案

    问题是在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));
    

    如果某个元素多次出现在列表中,则会将其打印多次。使用^{}来记住元素是否已打印,不要再次打印:

    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没有顺序

  4. # 4 楼答案

    试试这个

        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