如果数字中已存在数字,那么不会跳过吗?

时间:2016-09-21 19:47:06

标签: java arrays arraylist

我目前正在尝试创建一个方法,显示数组中存在的数字的次数。

我的方法是:

public void freq(int[] arr) {
        Arrays.sort(arr);
        String output = "";
        int count = 0;
        for (int i = 0; i < arr.length; i++) {
            if (this.helper(arr[i]) == true) {
                i++;
            } else if (this.helper(arr[i]) == false) {
               for (int k : arr) {
                    if (k == arr[i]) {
                        count++;
                    }
                }
                System.out.println("Number of instances to: " + arr[i] + " : " + count);
                count = 0;
            }
        }
    }

帮助程序类用于检查是否已经检查了要检查的数字。我正在使用arraylist来存储已经检查过的数字:

private List<Integer> existingInt = new ArrayList<Integer>();

编写方法助手:

public boolean helper(int i) {
    boolean alreadyExists = false;
    for (int k : existingInt) {
        if (i == k) {
            alreadyExists = true;
            return alreadyExists;
        } else {
            existingInt.add(i);
            alreadyExists = false;
            return alreadyExists;
        }
    }
    return alreadyExists;
}

如果数字存在,Helper会返回布尔值,true或false。此后,我在if语句中检查它是返回true还是false。如果为true,那么我跳过(或至少尝试)以:

if (this.helper(arr[i]) == true) {
    i++;
}

简而言之,我的方法计算整数数组中的出现次数。如果我的帮助方法返回true,那么它没有做的就是跳过检查。

4 个答案:

答案 0 :(得分:3)

由于您正在对数组进行排序,因此可以执行此操作

    for (int i = 0; i < arr.length;) {
        int count = 1;
        int num = arr[i];
        while(++i < arr.length && arr[i] == num) {
            count++;
        }
        System.out.println("Number of instances to: " + num + " : " + count);
    }

答案 1 :(得分:1)

您应该从else部分删除return alreadyExists;。如果第一项不是i,它会自动返回false。

编辑:您的方法不必要地复杂。你可以使用它:

public boolean helper(int i) {
    for (int k : existingInt) {
        if (i == k) {
            return true;
        }
    }
    existingInt.add(i);
    return false;
}

更好的是,您可以使用HashSet:

private HashSet<Integer> existingInt = new HashSet<Integer>();

public boolean helper(int i) {
    return existingInt.add(i);
}

答案 2 :(得分:1)

您可以通过跟踪地图中找到的数字作为地图关键字来计算出现次数,并将地图递增为数字出现次数的计数。

唯一的技巧是在第一次找到该号码时将号码放在地图中。

我使用SortedMap,由TreeMap实现,因此在获得keySet时,数字将按升序排序,以获得良好的输出。

这是一个包含测试main的完整类,可以在默认包中编译和运行:

import java.util.SortedMap;
import java.util.TreeMap;

public class Counter
{
    public void printFreq(final int[] numbers)
    {
        // Use a sorted map so our output is ascending.
        final SortedMap<Integer, Integer> numCounts = new TreeMap<>();

        // Count occurrences in the provided numbers
        for (final Integer i : numbers)
        {
            Integer count = numCounts.get(i);   // Get the current count
            if (count == null) count = 0;       // or init it to zero if there isn't one
            numCounts.put(i, ++count);          // Increment count and put it (back) in the map
        }

        // Output the counts
        for (final Integer n : numCounts.keySet())
        {
            System.out.printf("%d : %d\n", n, numCounts.get(n));
        }
    }


    public static void main(String[] args)
    {
        final Counter c = new Counter();
        final int[] nums = { 3, 8, 1, 3, 12, 1, 3, 42, 12, 8 };
        c.printFreq(nums);
    }
}

答案 3 :(得分:0)

当您的existingInt为空时,您不会致电add(i)将新项目添加到existingInt。因此,根据帮助程序代码,existingInt将始终为空。

之所以会发生这种情况,是因为您不会进入for for iteration语句。

public boolean helper(int i) {
    if (!existingInt.contains(i)) {
        existingInt.add(i);
        return false;
    }

    return true;
}

实际上,您希望对整数数组执行groupBy标识操作,并计算出现次数。使用Java 8 Streams

很容易
Arrays.stream(array)
    .boxed()
    .collect(groupingBy(
        Function.identity(), 
        counting()
     ));

您将获得Map<Integer, Long>每个元素的计数。