使用循环,对比两组数组遇到的问题,java新人求教!!!

VitoYi 2016-10-13 02:59:22
先上图片版:



以下是代码版:

/**
* 我有一个需求,好比我现在是在卖彩票,我建立了一个长度为4的int类型数组,通过random的方式,为数组【stochastic】中的4个位置分别都赋了值。
* 然后客户来买彩票,我同样建立了一个长度为4的【number】数组,使用for循环的方式让客户为数组中每个位置赋值(就好比买彩票,客户选了4个号)。
* 中奖的规则是:主要用户选的号,能和我随机生成的数字对上即可,不要求位置。
* 比如我随机生成的数字是:1、2、3、4,客户选的号码是4、3、2、1,虽然位置不同,但号码全部都对上了,这就是一等奖。
* 如果有3个数字对上,那就是二等奖。 2个数字对上,三等奖。 1个数字对上,四等奖。 一个数字都没有对上,那就是没有中过奖,就可以滚粗了。
*/
import java.util.Scanner;
public class ¥ddd {
public static void main(String[] args){
Scanner input=new Scanner(System.in);
int[] stochastic=new int[4];
for(int i=0;i<stochastic.length;i++){
stochastic[i]=(int)(Math.random()*10);
}
//彩票内幕——输出随机数看结果
for(int i:stochastic){
System.out.print(i+"\t");
}
System.out.println();
//用户给数组number赋值
int[] number=new int[4];
for(int i:number){
System.out.print("请输入第"+(i+1)+"位数(0—9):");
number[i]=input.nextInt();
}
int sum=0;
//双重循环,stochastic做外层
for(int i=0;i<stochastic.length;i++){
for(int k=0;k<number.length;k++){
if(stochastic[i]==number[k]){
sum++;
/*
* 做到这一步就失败了,不知道该怎么操作了,根本是行不通的。我想通过一个为0的sum变量,只要有1个数字对上,那么sum就+1.
* 2个对上,sum就+2. 全部对上,sum就+4。 然后再通过switch来输出不同的中奖结果。
* 但是我仔细想了一下,根本行不通,因为这个循环的运行结果是:
* 如果(假设)stochastic[0]=3, number[0]=3, number[1]=6, number[2]=3, number[3]=6.
* 那么 stochastic[0]和number[0]=3对上了,这个时候sum加了1;
* 但是这时候number[k]又进入了第二次的循环, stochastic[0]又和number[2]对上了,这个时候sum又加了1.
* 您看,在i的第一轮循环,仅仅是对比stochastic的第一个数值,sum就已经加了2次了。所以这个操作方法根本就是错误的。
*
* 那么,又该如何操作呢???
*/
}
}
}
System.out.println(sum);
}
}
...全文
644 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
大玉莞尔 2016-10-17
  • 打赏
  • 举报
回复
下面是我测试通过的代码。JDK1.8 使用工具IDEA package test.Array; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * Created by liudy on 16/10/17. */ public class Test { public static void main(String[] args) { // 随机生成的值autoArray int[] autoArray = new int[4]; for (int i = 0; i < autoArray.length; i++) { autoArray[i] = (int) (Math.random() * 10); System.out.println(autoArray[i]); } // 客户输入的值 Scanner input = new Scanner(System.in); int[] customArray = new int[4]; for (int i = 0; i < customArray.length; i++) { System.out.print("请输入(0—9)以内的数:"); customArray[i] = input.nextInt(); // System.out.println(customArray[i]); } // 比较两个数组 int sum = 0;// 记录相同值得个数 List correct= new ArrayList<>(); // 记录已经被选中过的数 for (int j = 0; j < autoArray.length; j++) { for (int k = 0; k < customArray.length; k++) { if(correct.contains(k)){ continue; }else if (autoArray[j] == customArray[k]) { sum += 1; correct.add(k); continue; } } } System.out.println("共有" + sum + "个数相同"); switch (sum) { case 0: System.out.println("没有值相同"); break; case 1: System.out.println("四等奖"); break; case 2: System.out.println("三等奖"); break; case 3: System.out.println("二等奖"); break; case 4: System.out.println("一等奖"); break; } } }
NewMoons 2016-10-14
  • 打赏
  • 举报
回复
你的需求本身就是有问题的,比如下面这些情况,你说应该是几等奖? 开奖号:1134 彩票号:1133
nikyotensai 2016-10-14
  • 打赏
  • 举报
回复
引用 6 楼 VitoYi 的回复:
[quote=引用 3 楼 qq_26508409 的回复:] 两个数组都排序一下再比较
尝试过,两组都使用升序,但并没什么用[/quote] 这话不像新人,大牛呀!排序之后的比较肯定比之前逻辑要简单一些,你说没用,愿听高见。
hnl9211 2016-10-14
  • 打赏
  • 举报
回复
需求应该是,如果下码与出码对上了,就算中一个码,它们就都不再继续参与对比。 思路:使用双层嵌套循环,外层遍历下码,内层是出码。如果下码对上出码,则 1)累加中一码, 2)标记该出码已对比过(下次再对上也不算中码),需要另外一个数组来作为标记 3)跳出内循环,因为继续再对上也不能算再中码。
hnl9211 2016-10-14
  • 打赏
  • 举报
回复

/*
		 * 该需求中,应该是要求:下码跟出码只要对上,就算中一个码,再跟别的码对上也不算再中码,
		 */
		int[] chuma={1,1,3,3};//出码,假设
		int[] xiama={1,1,3,4};//下码,假设
		//记录出码是否对比过,下标与stochastic一一对应,false为没对过,true为已经对过码
		boolean[] flag=new boolean[4];//默认都为false
		int sum=0;//记录中码数
		for(int x=0;x<xiama.length;x++){
			for(int c=0;c<chuma.length;c++){
				if(xiama[x]==chuma[c] && (!flag[c])){
					//下码对上出码,并且出码没进行对比过
					sum+=1;
					flag[c]=true;//标记为已经对过码
					break;//下码对上出码,就不再跟出码后面的对比
				}
			}
		}
		String[] str={"没中奖","四等奖","三等奖","二等奖","一等奖"};//根据sum来取出对应的中奖
		System.out.println(str[sum]);
VitoYi 2016-10-13
  • 打赏
  • 举报
回复
引用 4 楼 qq_27697777 的回复:
你可以把比较过的彩票数组用特殊值标记出来,如果(假设)stochastic[0]=3, number[0]=3, number[1]=6, number[2]=3, number[3]=6的情况,可以把比较后的stochastic[0]的值改为10这种,不可能取到的数。或者开一个彩票数组A[10],A数组初始为全0,使用随机数生成彩票时,随机数对应A数组下标,然后加一。比如随机数得到5,就A[5]++。在比较数组时,遇到相同的就该位置减一。这样不会出现你说的情况
抱歉哈,没太明白什么意思。 我同学下午把这个问题搞出来了,是建立一个变量记录匹配到的数在随机数组中的位置
VitoYi 2016-10-13
  • 打赏
  • 举报
回复
引用 5 楼 soton_dolphin 的回复:
Arrays.sort(array1); Arrays.sort(array2); int prize = 5; for(int i = 0; i< array1.length; i++){ if (array1[i] == array2[i]){ prize --; } switch(prize){ case 1: case 2: case 3: case 4: }
您的方法是先升序,再使用一重循环找对应。 这样的话,对位置有要求,比如array1[0]要和array2[0]相等, 如果array1[0]和array1[2]相等,那么结果依然为false; 这和我的需求并不匹配。
VitoYi 2016-10-13
  • 打赏
  • 举报
回复
引用 3 楼 qq_26508409 的回复:
两个数组都排序一下再比较
尝试过,两组都使用升序,但并没什么用
soton_dolphin 2016-10-13
  • 打赏
  • 举报
回复
Arrays.sort(array1); Arrays.sort(array2); int prize = 5; for(int i = 0; i< array1.length; i++){ if (array1[i] == array2[i]){ prize --; } switch(prize){ case 1: case 2: case 3: case 4: }
qq_27697777 2016-10-13
  • 打赏
  • 举报
回复
你可以把比较过的彩票数组用特殊值标记出来,如果(假设)stochastic[0]=3, number[0]=3, number[1]=6, number[2]=3, number[3]=6的情况,可以把比较后的stochastic[0]的值改为10这种,不可能取到的数。或者开一个彩票数组A[10],A数组初始为全0,使用随机数生成彩票时,随机数对应A数组下标,然后加一。比如随机数得到5,就A[5]++。在比较数组时,遇到相同的就该位置减一。这样不会出现你说的情况
nikyotensai 2016-10-13
  • 打赏
  • 举报
回复
两个数组都排序一下再比较
VitoYi 2016-10-13
  • 打赏
  • 举报
回复
引用 1 楼 Louis0531 的回复:
开奖号码能重复么? 非要用数组实现么?
您好,开奖号码是可以重复的,因为本身就是使用random获取的随机数,使用强制类型转化,再*10,就可以确保这个得到的随机数是在0—9之间。 也可以不使用数组实现,只是我刚学java不久,目前只学到了数组,所以自然就想到了数组……
Louis0531 2016-10-13
  • 打赏
  • 举报
回复
开奖号码能重复么? 非要用数组实现么?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧