如何将一个包含6个元素的整数数组与一个包含19行5列整数的二维整数数组进行比较?

3

我正在为学校的项目工作,但是无法理解这个问题。请注意,我非常初级。

我有一个二维数组叫做tickets[19][6],其中每张彩票有6个整数,共有20张彩票。 我试图将这20张彩票与一个名为winner[5]的、包含6个数字的普通数组进行比较,该数组是从一个 .txt 文件中读取的。

两个数组的声明如下:

public static int[] winner = new int[5]
public static int[][] tickets = new int[19][5]

请记住我是新手,非常感谢您提供的任何帮助!
编辑 这是我用来将用户输入分配到我的二维数组中的循环,刚刚意识到整个过程中它是一个无限循环。我原以为编写代码会更多地像是编写!到目前为止似乎更像是调试的艺术。
static void ticketNumberArray(){

    int number = 1;        // which of the six numbers you need from the ticket
    int ticketCount = 1;   // which ticket (out of 20) you are currently on

    while(ticketCount<21){ // sentinel controlled while loop,
                           // will continue until the twentieth ticket is entered
        System.out.println("Please type number " +number+ " of ticket number " +ticketCount+ ".");
                           //asks for the numbers of the ticket your currently on

        Scanner keyboard = new Scanner(System.in); // initiates a scanner variable

        int ticketNumber = keyboard.nextInt();     // assigns user input to the double variable ticketNumber
                                                   // and initializes as a double

        tickets[ticketCount-1][number-1]=ticketNumber;  // assigns user input into a 2-d array

        number++;           //Sentinel variable

        if(number==7){      //loop that controls the ticket count, every 6 numbers ='s one ticket
            ticketCount++;
            number=1;
        }
    }
}

1
你的“比较”指的是什么?是测试相等性吗? - Louis Wasserman
1
我相信测试相等是的。我试图将winner[]与tickets[][]进行比较,目的是在tickets[][]中搜索与winner[]匹配的内容。 - BBradshaw1
你需要使用所谓的“迭代”——例如 for 循环。可能需要三个嵌套循环。(好吧,重新阅读你的问题后,可能只需要两个嵌套循环。) - Hot Licks
2
3个嵌套的for循环?额,不... - debracey
2个回答

3
首先,你在声明数组时放入[ ]中的数字是数组的大小。因此,要创建一个有六个项目的数组,你需要放入[6]。索引将被标记为0-5。
你只需要循环遍历tickets数组中的票“行”,并将其与获奖者数组进行比较。每一行都是一个单独的票。2D数组中的“列”将是组成该票的单个数字。
如果票中各个数字的顺序很重要,你可以使用Louis的建议和Arrays.equal。 (即,如果赢家是 0-1-2-3 ,则只能使用 0-1-2-3 获胜 - 大多数彩票都允许您赢得任何组合。)
for(int i=0; i < tickets.length; i++)
{
   int[] ticket = tickets[i];

   if(Arrays.equals(ticket, winner))
   {
      // This one is the winner

      // For efficiency you should probably stop looping
      break;
   }
}

编辑:

许多初级教授不喜欢学生使用API,因此您需要编写自己的等于函数。

private static boolean areEqual(int[] a, int[] b)
{ 
   if(a == null && b == null)
       return true;

   // Not equal if one is null and the other is not     
   if(a == null || b == null)
       return false;

   if(a.length != b.length)
       return false;

   // When we get here we have to check each element, one by one
   // Implementation left as exercise :-)
}

mk,所以我猜我必须用获胜者和门票分别填写a和b...然而,我不确定您所说的实现是什么意思。到目前为止,这看起来与我学过的任何代码都不一样=/ - BBradshaw1
areEqual 是一个函数,它应该做与 Arrays.equals() 相同的事情。正如我所说,很多教授不喜欢学生调用 API。你只需要调用 areEqual(ticket, winner) 而不是调用 Arrays... 函数。我留下了实际检查数组元素(在 areEqual() 中)的实现给你去完成... - debracey
好的,我认为我可以从那里开始了...我还在努力将用户输入分配给2D数组。我刚试图输入所有20张票,但陷入了无限循环。这是我得到的结果。在原问题中添加了循环 - BBradshaw1
你不能在Stack Overflow上放置过长的评论。针对输入问题,请新开一个问题。 - debracey

1

门票上有5个整数还是6个?你的问题自相矛盾。

无论如何,如果你只想检查门票中的整数是否匹配——即它们在完全相同的顺序中具有完全相同的值——最简单的解决方案就是使用Arrays.equals(int[], int[])


我已经尝试过了,但是tickets[][]是一个二维数组,它无法与winner[]进行比较...我尝试使用'deep.equals',但也不起作用。=/ - BBradshaw1
当然不是。您必须将单张彩票与 winner 进行比较。因此,Arrays.equals(tickets[i], winner) 将告诉您是否 tickets[i] 等于 winner - Louis Wasserman
你知道吗,这其实非常有道理,我能理解为什么我没有想到它……而且我可以用i作为哨兵来比较它们所有的值,做一个while循环……我马上就试试看。真是太神奇了,在这里回复速度多快! - BBradshaw1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接