我需要编写一个方法,其中int[]
将作为输入提供,它应该返回一个数组,但所有数字的出现次数超过n次。
Inputs:
(int list) data = [1, 2, 2, 3, 3, 3, 4, 5, 5]
Output:
(int list) [1, 4]
这些是我尝试过的步骤。
迭代LH并找到带有迭代器的ArrayList的收集频率。
int[] intArray = new int[0];
if(n!=0){
if(data.length<100){
ArrayList<Integer> inputList = new ArrayList<Integer>(data.length);
//System.out.println(Arrays.toString(data));
for (int i = 0; i < data.length; i++){
inputList.add(Integer.valueOf(data[i]));
}
LinkedHashSet<Integer> lhs = new LinkedHashSet<>(inputList);
intArray = new int[lhs.size()];
int i=0;
int j=0;
Iterator<Integer> itr = lhs.iterator();
while(itr.hasNext()){
Integer shiftNumber = itr.next();
if(Collections.frequency(inputList, shiftNumber)==1) {
intArray[i++] = shiftNumber.intValue();
j++;
}
}
intArray = Arrays.copyOf(intArray, j);
return intArray;
}
}
return intArray;
我能够使用上面的代码段来实现结果。但是,我需要通过使用任何算法或其他集合对象来减少代码段并提高性能的建议。
答案 0 :(得分:3)
您可以改用地图。
map键表示在数组中找到的值;地图值将是一个计数器。
你迭代你的数组,对于每个元素你要么把一个counter = 1(当第一次找到那个值时);或者你只是增加那个计数器。
最后,您只收集那些显示计数器值为1的地图键。
答案 1 :(得分:2)
您可能会使算法过于复杂。将每个值映射到其频率可能更简单,然后复制频率小于n
的值。另请注意,您不需要在int
和Integer
之间明确隐蔽:Java会自动为您执行此操作。
int[] output = new int[input.length];
Map<Integer,Integer> counts = new HashMap<>();
int size = 0;
for (int i = 0; i < input.length; i++) {
counts.put(input[i], counts.getOrDefault(input[i], 0) + 1);
}
for (int i = 0; i < input.length; i++) {
if (counts.get(input[i]) < n)
output[size++] = input[i];
}
return Arrays.copyOf(output, size);
如果您熟悉Java 8流,那么代码可以大大减少:
Map<Integer,Integer> count = Arrays.stream(input).boxed()
.collect(groupingBy(identity(), counting()));
return Arrays.stream(input).filter(i -> count.get(i) < n).toArray();