[英]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
. . . . .
. . . . .
. . . . .
然后,我们需要随机打乱这个数组。 这里有几个选项是可能的。 一个选项可能如下所示:
如果以一维数组的形式呈现二维数组,则任务会大大简化。
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.