繁体   English   中英

在 Java 中用百分比填充二维数组

[英]Fill 2D array with percentage in Java

我有一个像这样填充的 5x5 二维数组:

 -----
 -----
 -----
 -----

我试图按百分比填充此数组,例如40%

-e--e
---f-
-i-h-
-ghh-
---ii

如您所见,25 的 40% 是 10,因此数组中添加了 10 个字符,我的代码是:

     private static char[][] fillArrayWithThisPercentage(int percentage, char[][] arrayOfChars, char startChar, char endChar) {
        int size = 5;
        int arraySize = size * size;
        float percentageOfSize = (percentage / 100f * arraySize);

        int filled = 0;
        while (filled <= percentageOfSize) {
            int i = getRandomNumber(size);
            int j = getRandomNumber(size);
            arrayOfChars[i][j] = getRandomChar(startChar, endChar);
            filled++;
        }
      }

获取两个字符范围内的随机字符:

private static char getRandomChar(char startChar, char endChar) {
        String alphabet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
        List<String> alphabetList = Arrays.asList(alphabet.split(","));
        int max = alphabetList.indexOf(startChar + "");
        int min = alphabetList.indexOf(endChar + "");
        int randomNumber = (int) ((Math.random() * (max - min)) + min);
        return alphabetList.get(randomNumber).charAt(0);
    }

Output:

b----
--db-
--a--
-----
a----

您正在实施蛮力方法,这适用于 SMALL 矩阵。 只需保留挑选点,直到找到可用的点:

  private static void fillArrayWithThisPercentage(int percentage, char[][] arrayOfChars, char startChar, char endChar) {
    int size = 5;
    int arraySize = size * size;
    int percentageOfSize = (int)(percentage / 100f * arraySize);

    int filled = 0;
    while (filled < percentageOfSize) {
      int i;
      int j;
      do {
        i = getRandomNumber(size);
        j = getRandomNumber(size);
      } while (arrayOfChars[i][j] != '-');
        
      arrayOfChars[i][j] = getRandomChar(startChar, endChar);
      filled++;
    }
  }

请注意,我将返回类型更改为void并将您的percentageOfSize更改为int并使其变为while (filled < percentageOfSize)

正如我在上面的评论中所建议的,您可以先从头开始用值填充数组,然后对数组进行洗牌。 首先,我们需要用给定数量的字符(在您的例子中是 10 个)填充 5x5 数组,因此生成的数组将如下所示:

a b c d e
f g h i j
. . . . .
. . . . .
. . . . .

然后,我们需要随机打乱这个数组。 这里有几个选项是可能的。 一个选项可能如下所示:

  • 对于数组中的前 N 个符号 // N = 40% 的数组容量
  • 随机选择一对新的坐标
  • 将该符号与所选坐标中的符号交换;

如果以一维数组的形式呈现二维数组,则任务会大大简化。

private static void fillArrayWithThisPercentage(int percentage, char[][] arrayOfChars, char startChar, char endChar) {
    int size = arrayOfChars.length;
    int percentageOfSize = (int)(percentage / 100 * size * size);
    Random random = new Random();

    // fill entire array with '-' symbol
    for (var line : arrayOfChars) {
         Arrays.fill(line, '-');
    }

    // place N random chars to array from beginning
    for (int i  = 0; i < percentageOfSize; i++) {
        arrayOfChars[i / size][i % size] = (char) random.nextInt(startChar, endChar);
    }

    // shuffle an array
    for (int i = 0; i < percentageOfSize; i++) {
        int newPosition = random.nextInt(size * size);
        swap(arrayOfChars, i, newPosition);
    }
}

private static void swap(char[][] arr, int i, int j) {
    char temp = arr[i / arr.length][i % arr.length];
    arr[i / arr.length][i % arr.length] = arr[j / arr.length][j % arr.length];
    arr[j / arr.length][j % arr.length] = temp;
}

你可以用这样的东西来测试这种方法:

char[][] arr = new char[5][5];
fillArrayWithThisPercentage(40, arr, 'a', 'z');

for (var row : arr) {
    System.out.println(Arrays.toString(row));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM