我正在尝试仅打印数组中的重复元素,而每次出现了多少次。
示例:
Number 0 appears 3 times;
Number 12 appears 2 times;
Number 43 appears 2 times
我的代码打印数组的所有元素,而不是仅打印重复元素。
我必须提到我不能使用HashMap
,只有conditional statments
。
谢谢以下是代码:
int[] array = new int[] { 12, 0, -22, 0, 43, 545, -4, -55, 12, 43, 0, -999, -87 };
int counter = 0, temp = 0;// variable that holds the temporary value of each element
Arrays.sort(array);
for (int i = 0; i < array.length; i++) {
temp = array[i];
counter = 0;
for (int j = 0; j < array.length; j++) {
if (temp == array[j]) {
counter++;
}
}
System.out.println("Number:" + array[i] + "occurs :" + counter + " times");
}
您可以使用HashMap
或使用Simple sorting
,因为您的每个注释简单方法如下
int[] array = new int[]{12, 0, -22, 0, 43, 545, -4, -55, 12, 43, 0, -999, -87};
int counter = 0,
temp = 0;//variable that holds the temporary value of each element
Arrays.sort(array);
temp=array[0];
int count=1;
for(int i=1;i<array.length;i++)
{
//System.out.println(array[i]);
if(temp==array[i])
{
count++;
}
else
{
if(count==1)
{
count=1;
}
else{
System.out.println(array[i-1]+" "+count);
count=1;
}
temp=array[i];
}
}
尝试以下:
package com.stackoverflow.java;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class DuplicatesAndCount {
public static void main(String[] args) {
int[] array = new int[]{12, 0, -22, 0, 43, 545, -4, -55, 12, 43, 0, -999, -87};
// taking hashmap to accumulate corresponding couter of each number
HashMap<Integer, Integer> ht = new HashMap<Integer, Integer>();
for (Integer newNumber : array) {
if (ht.get(newNumber) == null) {
ht.put(newNumber, 1);
} else {
ht.put(newNumber, ht.get(newNumber) + 1);
}
}
System.out.println(ht);
// now iterate the map
for (Map.Entry<String, Integer> entry : map.entrySet()) {
Integer number = entry.getKey();
Integer count = entry.getValue();
if (count > 1) {
System.out.println("Number: " + number + "count: " + count);
}
}
}
}
一个简单的解决方案是使用地图来计算每个数字的出现数量。然后,迭代地图并报告其数量为两个或更多的任何数字。
int[] array = new int[]{12, 0, -22, 0, 43, 545, -4, -55, 12, 43, 0, -999, -87};
Map<Integer, Integer> map = new HashMap<>();
for (int num : array) {
Integer count = map.get(num);
map.put(num, count == null ? 1 : count.intValue() + 1);
}
// now iterate the map
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
Integer num = entry.getKey();
Integer count = entry.getValue();
if (count > 1) {
System.out.println("Number: " + num + ", occurs: " + count + " times");
}
}
demo
这是我的版本:
Integer[] arr = {1,2,2,2,1,3,5,4,1};
Arrays.stream(arr).distinct()
.forEach(x -> System.out.println(x + " appears " + Collections.frequency(Arrays.asList(arr), x) + " times."));
我们从游戏中删除了重复项,因此我们留下了唯一的元素,然后对于流中的每个唯一元素,我们都会打印出原始数组中出现多少次。
这个问题有许多解决方案。我将其中一些作为起点,但将编码留给您。
- 使用
HashMap
并将<Number, Frequency>
存储在地图中。 - 如果不允许您使用地图,则可以进行双循环并检查所有事件。那将是o(n 2 )。
- 一个更好的修改将是先对数组进行排序,然后比较连续的元素。这将是o(n log n)。
- 您可以使用
Collections.frequency()
,但这将在列表上操作,因此可以转换您的数据结构(也许是通过流)。
一旦使用了任何这些方法,就可以滤除具有1个频率的数字。