簡體   English   中英

使用int []數組通過嵌套循環相互操作

[英]Using int[] arrays to manipulate each other through nested loops

我想做的是使用一種方法從0-15生成30個隨機數,然后使用另一種方法計算每個數字打印多少次並將其放入第二個數組中。 第二個數組中的每個位置都對應於它所在的數組中的數字。 如果i = [0]並且0出現3次,則應該為3,依此類推。

到目前為止,我已經明白了。 似乎正在發生的事情是,它計算15出現的次數(數組的最后一個數字)。 雖然我可能是錯的。 我看不到我在做什么錯。 我的邏輯肯定有問題。

import java.util.Arrays;

public class FrequencyOfNumbers {

    public static void main(String[]args){
        System.out.println(Arrays.toString(randomNums()));
        System.out.println(Arrays.toString(sortedNums(randomNums())));
    }

    public static int[] randomNums (){
        int[] random = new int[30];
        for(int i=0;i<random.length;i++){
           double randNum = Math.random() * 16;
            random[i] = (int)randNum;
        }
        return random;
    }

    public static int[] sortedNums(int[] sort){
        int[] numVals = new int[15];
        for(int i=0;i<numVals.length;i++)
        {
            for(int j=0;j<sort.length;j++)
            {
                if(sort[j] == numVals[i])
                {
                    numVals[i]++;
                }
            }
        }
        return numVals;
    }
}

我收到的示例輸出:

[5, 15, 0, 5, 4, 10, 4, 11, 5, 13, 13, 8, 9, 9, 10, 6, 0, 9, 10, 12, 3, 7, 4, 9, 4, 11, 9, 15, 10, 7]

[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]

要計算集合中對象的實例數,可以使用Collections.frequency()

ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < sort.length; i++) {
    list.add(sort[i]);
}

for(int i = 0; i< numVals.length;i++){
    numVals[i] = Collections.frequency(list, i);
}
return numVals;

您在代碼中有一些問題:

  1. 不要兩次調用randomNums() 否則,您將無法計算正確的頻率。 它將生成不同的數組。

  2. 如果要將數字保持在0到15之間,則應為numVals分配16個元素。

  3. 計算外觀時,不需要內部for循環。 只要考慮所有數字,取它們的值,然后增加出現次數。

嘗試這個:

public static void main(String[] args) {
    int[] randomNumbers = randomNums();
    System.out.println(Arrays.toString(randomNumbers));
    System.out.println(Arrays.toString(sortedNums(randomNumbers)));
}

public static int[] randomNums() {
    int[] random = new int[30];
    for (int i = 0; i < random.length; i++) {
        random[i] = (int) (Math.random() * 16);
    }
    return random;
}

public static int[] sortedNums(int[] sort) {
    int[] numVals = new int[16];
    for (int j = 0; j < sort.length; j++) {
        numVals[sort[j]]++;
    }
    return numVals;
}

可能的輸出:

[8, 6, 5, 12, 12, 9, 15, 6, 7, 9, 15, 3, 6, 7, 3, 8, 6, 3, 15, 8, 12, 4, 7, 12, 2, 15, 6, 5, 4, 5]
[0, 0, 1, 3, 2, 3, 5, 3, 3, 2, 0, 0, 4, 0, 0, 4]

性能

如果要(實際)計算比較次數,可以:

  1. 在您的班級中創建一個新成員:

     static int steps = 0; 
  2. 定義一個增加計數器的新方法:

     private static boolean f() { steps++; return true; } 
  3. if ,在當前條件之前添加f() &&

  4. main方法中添加以下最后一行:

     System.out.println(steps); 

僅使用一個for你會產生30步。

使用2 for循環(如您在注釋中所寫)將生成480步( 480 = 30 * 16 )。

在這種情況下無關緊要,因為兩個操作都非常快。 但是對於較大的輸入,如果第一種方法花費1秒,則應注意第二種方法是否花費10秒以上。

暫無
暫無

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

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