繁体   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