在数组中查找重复项并仅打印一次

时间:2015-04-25 16:43:09

标签: java arrays file for-loop duplicates

我正在尝试遍历我的数组并找到所有重复多次的数字:

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]);
            }
        }
    }

6 个答案:

答案 0 :(得分:2)

只需将您会发现重复的数字添加到某些结构中,例如HashSetHashMap,以便稍后在检测到其他重复时找到它。

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]