我正在尝试遍历我的数组并找到所有重复多次的数字:
E.G:如果有1 1 2 3 4
它应该打印说“1不止一次重复”
这是我的代码,到目前为止我已尝试过,但是它打印所有重复项并继续运行,如果有4 4 4 4 3 6 5 6 9
,它将打印所有4个但我不想要:
class average {
public static void main(String[] args) throws IOException {
int numOfLines = 0;
int sum = 0, mean = 0, median = 0, lq = 0, uq = 0;
int[] buffer;
File myFile = new File("num.txt");
Scanner Scan = new Scanner(myFile);
while(Scan.hasNextLine()) {
Scan.nextLine();
numOfLines++;
}
Scan.close();
Scan = new Scanner(myFile);
System.out.println("Number Of Lines: " + numOfLines);
buffer = new int[numOfLines];
for(int i=0; i<numOfLines; i++) {
buffer[i] = Scan.nextInt();
}
Scan.close();
Scan = new Scanner(myFile);
for(int i=0; i<buffer.length; i++) {
sum = sum+i;
mean = sum/numOfLines;
}
System.out.println("Sum: " + sum);
System.out.println("Mean: " + mean);
for(int i=0; i<buffer.length; i++) {
for(int k=i+1; k<buffer.length; k++) {
if(buffer[k] == buffer[i]) {
System.out.println(buffer[k]);
}
}
}
答案 0 :(得分:2)
只需将您会发现重复的数字添加到某些结构中,例如HashSet
或HashMap
,以便稍后在检测到其他重复时找到它。
Set<Integer> printed = new HashSet<Integer>();
for(int i=0; i<buffer.length; i++) {
for(int k=i+1; k<buffer.length; k++) {
if(buffer[k] == buffer[i]) {
Integer intObj = new Integer(buffer[k]);
if (!printed.contains(intObj)) {
System.out.println(buffer[k]);
printed.add(intObj);
}
break;
}
}
}
更好的O(n)算法
Set<Integer> printed = new HashSet<Integer>();
for(int i=0; i<buffer.length; i++) {
if (!printed.add(new Integer(buffer[i])) {
System.out.println(buffer[i]);
}
}
答案 1 :(得分:1)
您对阵列的每个项目执行检查,包括第一个4
,第二个4
等。这就是为什么它不会停止并且每个重复元素多次打印消息。
您说您不能使用Set
并且您不想对数据进行排序。我的建议是你遍历数组并将每个重复的项添加到列表中。确保检查是否已添加该项目。 (或使用Set
:))
然后遍历列表并打印这些项目。
答案 2 :(得分:1)
我会使用HashMap
来存储我在数组中遇到的值,将count作为值。因此,如果您遇到4,您将在HashMap
中查找它,如果它不存在,您将使用值1添加它,否则增加返回的值。
您可以遍历HashMap
并获取所有值并打印数组中遇到的重复项数。
答案 3 :(得分:0)
使用 apache commons CollectionUtils.getCardinalityMap(集合):
final Integer[] buffer = {1, 2, 3, 4, 5, 6, 7, 2, 1, 7, 9, 1, 1, 3};
final List<Integer> list = Arrays.asList(buffer);
final Map<Integer, Integer> cardinalityMap = CollectionUtils.getCardinalityMap(list);
for (final Map.Entry<Integer, Integer> entry: cardinalityMap.entrySet()) {
if (entry.getValue() > 1) {
System.out.println(entry.getKey());
}
}
cardinalityMap的toString()在init之后看起来像这样:
{1=4, 2=2, 3=2, 4=1, 5=1, 6=1, 7=2, 9=1}
使用标准java :
final Integer[] buffer = {1, 2, 3, 4, 5, 6, 7, 2, 1, 7, 9, 1, 1, 3};
final List<Integer> list = Arrays.asList(buffer);
final Set<Integer> set = new LinkedHashSet<Integer>(list);
for (final Integer element: set) {
if (Collections.frequency(list, element) > 1) {
System.out.println(element);
}
}
答案 4 :(得分:0)
Integer[] ints = {1, 1, 2, 3, 4};
System.out.println(new HashSet<Integer>(Arrays.asList(ints)));
输出:[1,2,3,4]
答案 5 :(得分:0)
使用集合解决此问题要简单得多,而且可能更快。但是,根据要求,这里的答案使用“只是简单的数组[s]”而没有排序。我试图不要过多地更改你的代码,但是在异常的情况下我拒绝泄漏资源。
import java.io.*;
import java.util.Arrays;
import java.util.Scanner;
class Average {
public static void main(String[] args) throws IOException {
int numOfLines = 0;
int sum = 0, mean = 0, median = 0, lq = 0, uq = 0;
int[] buffer;
int flag = -1;
File myFile = new File("num.txt");
try (Scanner Scan = new Scanner(myFile)) {
while(Scan.hasNextLine()) {
Scan.nextLine();
numOfLines++;
}
}
try (Scanner Scan = new Scanner(myFile)) {
System.out.println("Number Of Lines: " + numOfLines);
buffer = new int[numOfLines];
for(int i=0; i<numOfLines; i++) {
buffer[i] = Scan.nextInt();
}
}
for(int i=0; i<buffer.length; i++) {
sum = sum+i;
mean = sum/numOfLines;
}
System.out.println("Sum: " + sum);
System.out.println("Mean: " + mean);
//copy every duplicate
int[] dupesOnly = new int[numOfLines];
int dupesOnlyIndex = 0;
for(int i=0; i<buffer.length; i++) {
for(int k=i+1; k<buffer.length; k++) {
if(buffer[k] == buffer[i]) {
dupesOnly[dupesOnlyIndex++] = buffer[i];
//System.out.println(buffer[k]);
}
}
}
//mark all but first occurrence of dupe
boolean[] skip = new boolean[dupesOnlyIndex]; //Inits to false
for (int i = 0; i < dupesOnlyIndex; i++) {
for(int k=i+1; k<buffer.length; k++) {
if(dupesOnly[k] == dupesOnly[i]) {
skip[k] = true;
}
}
}
//skip elements marked as extra dupes
int[] dupesUnique = new int[dupesOnlyIndex];
int dupesUniqueIndex = 0;
for (int i = 0; i < dupesOnlyIndex; i++) {
if (skip[i] == false) {
dupesUnique[dupesUniqueIndex++] = dupesOnly[i];
}
}
//trim to size
int[] dupesReport = new int[dupesUniqueIndex];
for (int i = 0; i < dupesReport.length; i++) {
dupesReport[i] = dupesUnique[i];
}
System.out.println("Dupes: " + Arrays.toString(dupesReport));
}
}
输入文件“num.txt”(由换行符分隔的数字不是逗号):
1, 2, 3, 4, 5, 6, 7, 2, 1, 7, 9, 1, 1, 3
输出:
Number Of Lines: 14
Sum: 91
Mean: 6
Dupes: [1, 2, 3, 7]