我目前正在尝试创建一个方法,显示数组中存在的数字的次数。
我的方法是:
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,那么它没有做的就是跳过检查。
答案 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>
每个元素的计数。