簡體   English   中英

如何從陣列中刪除重復項?

[英]How do you remove duplicates from an array?

我正在嘗試做的是,以便在填充數組增加的方法中填充它,如果值相同,它會檢查上面的索引。 但是,我不知道如何在不逐一檢查每個索引的情況下如何做到這一點而使其效率極低。 我試圖制作一個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;
    }
}

我絕不是算法專家,但是我認為可以進行以下簡單而容易的修改。

在算法的每次迭代中,您都可以在b = i + 1處啟動內部循環,而不是在b = 1處啟動內部循環。 這將產生等效的結果,因為如果您位於外部循環的索引i處,您已經將所有小於i的索引與數組的其余部分進行了比較。

您可以通過設置一些最小最大值來實現此目的,這些最大值會隨着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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM