在2D阵列中查找重复

时间:2014-04-28 21:03:09

标签: java arrays

我制作了一个程序,输出2D数组中的重复次数。问题是它输出两次相同的数字。

例如:我通过扫描仪输入2D数组中的数字:10 10 9 28 29 9 1 28。 我得到的输出是:

Number 10 repeats 2 times.
Number 10 repeats 2 times.
Number 9  repeats 2 times.
Number 28 repeats 2 times.
Number 29 repeats 1 times.
Number 9  repeats 2 times.
Number 1  repeats 1 times.
Number 28 repeats 2 times.

我想要它,如果它已经找到它的重复次数,它会跳过该数字。输出应为:

Number 10 repeats 2 times.
Number 9  repeats 2 times.
Number 28 repeats 2 times.
Number 29 repeats 1 times.
Number 1  repeats 1 times.

这是我的代码:

import java.util.Scanner;

public class Repeat
{
    static Scanner leopard = new Scanner(System.in);

    public static void main(String [] args)
    {
        final int ROW = 10;                     //Row size
        final int COL = 10;                     //Column size
        int [][] num = new int[ROW][COL];

        int size;

        //Get input
        size = getData(num);

        //Find repeat
        findRepeats(num, size);
    }

    public static int getData(int [][] num)
    {
        int input = 0, actualSize = 0;      //Hold input and actualSize of array

        System.out.print("Enter positive integers (-999 to stop): ");

        //Ask for input
        for(int i = 0; i < num.length && input != -999; i++)
        {
            for(int j = 0; j < num[i].length && input != -999; j++)
            {
                input = leopard.nextInt();

                //Check if end
                if(input != -999)
                {
                    num[i][j] = input;
                    actualSize++;
                }
            }
        }

        System.out.println();

        return actualSize;
    }

    public static void findRepeats(int [][] num, int size)
    {
        int findNum;
        int total = 0, row = 0, col = 0;

        for(int x = 0; x < size; x++)
        {
            //Set to number
            findNum = num[row][col];

            //Loop through whole array to find repeats
            for(int i = 0; i < num.length; i++)
            {
                for(int j = 0; j < num[i].length; j++)
                {
                    if(num[i][j] == findNum)
                        total++;
                }
            }

            //Cycle array to set next number
            if(col < num[0].length-1)
                col++;
            else
            {
                row++;      //Go to next row if no more columns
                col = 0;    //Reset column number
            }

            //Display total repeats
            System.out.println("Number " + findNum + " appears " + total + " times.");
            total = 0;
        }
    }
}

我知道为什么会这样做,但我无法弄清楚如何检查号码是否已经检查过它以跳过该号码然后转到下一个号码。我不能使用代码中没有使用的任何类或代码。

4 个答案:

答案 0 :(得分:1)

它会计算两次,第一次出现在代码中,第二次出现在代码中。

为避免这种情况,请让系统检查您是否已检查过该号码。我看到你使用check int数组,但你没有在代码中的任何地方使用它。

这样做,

如果您已经找到了数字,请将数字放入检查清单。

 int count = 0;
 check[count] = findNum;
 count++;

注意:您可以首先使用负数预先填充数组,以避免输入用户已经提供的数字。

下次在你的for循环中跳过检查你已经找到

的计数的那个号码
for(int x = 0; x < size; x++) {
   findNum = num[row][col];
     if(check.containsNumber(findNUm)) { //sorry there is no such thing as contains for array, write another function here which checks if a number exists in the array
       //skip the your code till the end of the first for loop, or in other words then don't run the code inside the for loop at all.
     }
}
坦率地说,我认为你刚开始学习编码。祝好运!有了这个,但这个代码可以改善很多。一条建议永远不会创建一个必须使用3个嵌套for循环的情况。

我希望您理解我的解决方案并且您知道如何做到这一点。

答案 1 :(得分:1)

由于你不能使用除此之外的任何东西,比方说,Java的基本元素考虑到这一点:

制作另一个带有两列的临时二维数组(或者只是两个独立的数组,我个人更喜欢这个数组)。在算法开始时,新数组为空。

从源2D结构中获取数字(任意数字)时,首先检查它是否存在于第一个临时数组中。如果是,只需将第二个临时数组中的值(count)递增一(+1)。如果它不存在于第一个tmp数组中,则将其添加到它并在第二个中增加count(+1)与第一个中新添加的数字相同的索引(这应该是数组的最后一项,基本上)。

这样您就可以在两个数组中构建数字对。第一个数组包含在2D数组中找到的所有不同值,第二个数组包含第一个数组中相应数字的出现次数。

在算法和算法中,只需并行迭代这两个数组,你就应该完成你的学校任务。我可以(和任何人)对此进行编码,但我们并没有真正帮到你,因为这是一个非常典型的学校作业。

答案 2 :(得分:1)

所有答案都会让您对问题有所了解。我尝试坚持你的代码,并添加一个交换的小技巧。使用此代码,您无需检查号码是否已输出。我感谢您的评论,编码的结构化方法,并尽可能清楚地提出问题。

public static void findRepeats(int [][] num, int size)
{
    int findNum;
    int total = 1, row = 0, col = 0;
    int [] check = new int[size];
    while(row < num.length && col < num[0].length)
    {
        //Set to number
        findNum = num[row][col];
      //Cycle array to set next number
        if(col < num[0].length-1)
            col++;
        else
        {
            row++;      //Go to next row if no more columns
            col = 0;    //Reset column number
        }
        //Loop through whole array to find repeats
        for(int i = row; i < num.length; i++)
        {
            for(int j = col; j < num[i].length; j++)
            {
                if(num[i][j] == findNum) {
                    total++;
                     //Cycle array to set next number
                      if(col < num[0].length-1)
                          col++;
                      else
                      {
                           row++;      //Go to next row if no more columns
                           col = 0;    //Reset column number
                      }
                      if(row < num.length - 1 && col < num[0].length -1)
                         num[i][j] = num[row][col];
                }
            }
        }


        //Display total repeats
        System.out.println("Number " + findNum + " appears " + total + " times.");
        total = 1;
    }
}

答案 3 :(得分:0)

您可以使用HashMap存储结果。它是这样的:

  // Create a hash map
  HashMap arrayRepeat = new HashMap();

  // Put elements to the map

  arrayRepeat.put(Number, Repeated);