读书人

求哪位大大帮忙看看数组去重有关问题

发布时间: 2012-10-20 14:12:48 作者: rapoo

求哪位大大帮忙看看,数组去重问题。
这里有个自己无聊用Java写的双色球生成器。
本来运行正常的。
后来发现生成的号码中有重复的数字。就加入了check(int[] i)方法。
该方法本来想要实现的功能是,冒泡法检查数组中是否有重复的元素,若有则重新生成。
但是加入之后整个程序就无限执行了。
我想知道为什么会这样,以及怎样改进代码以达到本来的目的。
不胜感激。

完整源码如下

Java code
import java.math.*;import java.util.Scanner;public class LotteryGenerator {    static int randomInt(int x){        int ret;        do{            double getran = (10000*Math.random());            ret = (int)getran;        }while(ret>x || ret==0);        return ret;    }    [] x,int[] y,int z){        int length;        System.out.println("模拟开奖结果 " + z);        System.out.print("红球是:");        for(length=0;length<x.length;length++){            System.out.print(x[length] + " ");        }        System.out.println();        System.out.print("蓝球是:");        System.out.println(y[0]);        System.out.println("=====================");    }    static boolean check(int[] x){        boolean isIlleg = false;        int i=0,j=0;        for(i=0;i<x.length;i++){            for(j=0;j<x.length;j++){                if(x[i] == x[j]){                    isIlleg = true;                }            }        }        return isIlleg;    }    static int input(){        Scanner s = new Scanner(System.in);        int i=0;        System.out.print("请输入开奖注数:");        i = s.nextInt();        System.out.println("=====================");        return i;    }    public static void main(String[] args) {        int[] general = new int[6];        int[] special = new int[1];        int i = input();        for(int c=0;c<i;c++){            do{                run(general,special);            }while(check(general));            java.util.Arrays.sort(general);            print(general,special,(c+1));        }    }}


[解决办法]
Java code
  static boolean check(int[] x){        boolean isIlleg = false;        int i=0,j=0;        for(i=0;i<x.length;i++){            for(j=0;j<x.length;j++){                if(x[i] == x[j]){                    isIlleg = true;                }            }        }        return isIlleg;    }
[解决办法]
check方法里面有个明显的bug。

双层循环,遍历同一个数组,下角标(i和j)会存在相同的时候,这个时候,进入if语句,返回true。

也就是说,楼主的check方法,怎么调用,都会返回true,造成主调函数中while循环变成了死循环,程序无法正常退出。

正确的逻辑,应该是在check方法体里面,双层循环中的if条件中,排除i和j相等的情况。
比如:if(x[i] == x[j] && i!=j){...}
[解决办法]
check 方法的问题,楼主再研究一下冒泡排序吧。冒泡排序可不是这么写的。
[解决办法]
4楼已经给出正解,还有两个问题
1.楼主用的太多的循环,有的不必要如:
static int randomInt(int x){
int ret;
do{
double getran = (10000*Math.random());
ret = (int)getran;
}while(ret>x || ret==0);
return ret;
}
可改成:
static int randomInt(int x){
double getran = (10000*Math.random());
return (int)getran%(x-1)+1;
}
2. 蓝色球是可以跟红球相同么?好像不行吧,楼主也没有进行判断。
[解决办法]
给分吧
//import java.math.*;
import java.util.Scanner;

public class LotteryGenerator {
static int randomInt(int x) {
int ret;
do {
double getran = (10000 * Math.random());
ret = (int) getran;
} while (ret > x || ret == 0);
return ret;
}

static void run(int[] x, int[] y) {
int i;
for (i = 0; i < x.length; i++) {
x[i] = randomInt(33);
}


y[0] = randomInt(16);
}

static void print(int[] x, int[] y, int z) {
int length;
System.out.println("模拟开奖结果 " + z);
System.out.print("红球是:");
for (length = 0; length < x.length; length++) {
System.out.print(x[length] + " ");
}
System.out.println();
System.out.print("蓝球是:");
System.out.println(y[0]);
System.out.println("=====================");
}

static boolean check(int[] x) {
boolean isIlleg = false;
int i = 0, j = 0;
for (i = 0; i < x.length; i++) {
for (j = 0; j < x.length; j++) {
if(j==i){
continue;
}
if (x[i] == x[j]) {
isIlleg = true;
}
}
}
return isIlleg;
}

static int input() {
Scanner s = new Scanner(System.in);
int i = 0;
System.out.print("请输入开奖注数:");
i = s.nextInt();
System.out.println("=====================");
return i;
}

public static void main(String[] args) {
int[] general = new int[6];
int[] special = new int[1];
int i = input();
for (int c = 0; c < i; c++) {
do {
run(general, special);
} while (check(general));
//run(general, special);
java.util.Arrays.sort(general);
print(general, special, (c + 1));
}
}
}

读书人网 >J2SE开发

热点推荐