如何从数组中删除重复项?

时间:2017-02-26 23:54:07

标签: java arrays duplicates

我试图使得在填充数组增加的方法填充时,如果值相同,则检查上面的索引。但是,我不知道如何在不单独检查每个索引的情况下执行此操作,从而使其效率极低。我试图创建一个for循环,其中I值为0并且增加1并且在for循环中是另一个for循环,b值为1并且也增加1.在第二个for循环中我有一个if语句并且如果I索引等于b索引,则再次重新评估I索引

public class CH7Ass {

    public static void main(String[] args) {
        int user;
        int[] array;
        int checkUserNum;
        int tries=0;
        System.out.println("I bet you can't guess my six numbers");     
        array=populate();
        do{
            tries++;
            user=getUserNum();
            checkUserNum=checkUserNum(user,array);
            array=removeFromArray(array,checkUserNum);
        }while(tries<6);
    }

    public static int[] populate(){
        int[] populate;
        populate= new int [6];
        int random;

        for(int i=0;i<populate.length;i++){
            random=(int) ((Math.random())*50);      //goes from 0-49
            populate[i]=random;
            System.out.println(populate[i]);
            for(int b=1;b<populate.length;b++){
                if(populate[b]==populate[i]){
                    populate[i]=random;
                }
            }
        }
        return  populate;
    }


    public static int getUserNum(){
        int getUserNum;

        do{
            System.out.println("Please input a number from 1 to 49:");
            getUserNum=TextIO.getInt();
        }while((getUserNum<1)||(getUserNum>49));

        return getUserNum;
    }

    public static int checkUserNum(int getUserNum,int[] array){
        boolean check=false;
        int checkUserNum = 0;
        for(int i=0;i<array.length;i++){
            if(array[i]==getUserNum){
                check=true;
                System.out.println("You got it");
                checkUserNum=i;
            }
        }
        if(check==false){
            checkUserNum=-1;
            System.out.println(checkUserNum);
        }

        return checkUserNum;
    }


    private static int[] removeFromArray(int[] array,int checkUserNum){
        int[] removeFromArray;
        if(checkUserNum!=-1){
            array[checkUserNum]=0;
            removeFromArray=array[checkUserNum];
        }
        return removeFromArray;
    }
}

2 个答案:

答案 0 :(得分:0)

我绝不是算法专家,但我认为你可以做的一个简单易行的修改如下:

在算法的每次迭代中,您可以在b = 1处启动,而不是在b = i + 1处启动内循环。这将产生一个等价的结果,因为如果你在外部循环的索引i,你已经将小于i的所有索引与数组的其余部分进行了比较。

答案 1 :(得分:0)

你可以通过设置一些最小值来增加,因为你的for循环有效。这样,您可以为随机数设置边界,并强制它们位于不同的边界内。

public static int[] populate(){
   int[] populate = new int [6];
   int random = 0;
   double maximum = 0.0;
   for(int i=0;i<populate.length;i++){
      maximum += ( 50 / 6 ); 
      random =   ( Math.random()  *  (  maximum  - (8 * i )  ) +  (8 * i ) ) ;      
      populate[i] = random;
   }
   return  populate;
}