java - 我怎样才能让洗牌器方法只洗牌数组中的某些索引?虽然不改组我想保持不变的索引
问题描述
我的问题如下:
char [] letters = {' ', 'a', ' ', 'b', ' ', 'c'};
for(int i = 0; i < letters.length; i ++) {
int random = (int) (Math.random()* letters.length);
char temp = letters[i];
letters [i] = letters [random];
letters [random] = temp;
}
这种方法对数组进行洗牌,很好;但是,我希望 shuffle 方法和 Math.random 方法都忽略空格,并且只随机播放具有字母值的索引。进一步解释:我希望字母数组的输出使所有空格的索引与原来的索引相同,同时只允许交换包含字母的索引。因此,在通过此方法后,字母数组的随机可接受输出示例如下所示:
['','b','','c','','a']
甚至可能
[ ' ', '出租车' ]
任何关于如何实现这一点的帮助都非常棒......我已经尝试了 for、while 和 if 循环的所有变体,试图将 Math.random 方法的边界限制为仅包含一个字母的索引,并且相同对于 for 循环,但我什么也没想到。它让我打败了。非常感谢任何可以帮助我并解释一下的人。
解决方案
使用以下逻辑:
char[] letters = { ' ', 'a', ' ', 'b', ' ', 'c', ' ', 'd' };
for (int i = 0; i < letters.length; i++) {
int random = (int) (Math.random() * letters.length);
// observe this
if (!Character.isWhitespace(letters[random]) && !Character.isWhitespace(letters[i])) {
char temp = letters[i];
letters[i] = letters[random];
letters[random] = temp;
}
}
解释 :
- 您可以添加一个简单的
if
条件来检查要交换的两个元素(即letters[random]
和letters[i]
)是否不是空格。
推荐阅读
- javascript - 使用 onSnapshot 时如何避免使用嵌套的 try catch?
- database - 是否可以存储每行数据的历史配置设置,而无需将所有配置设置塞进每行数据?
- java - 玩家头部运动检测 Bukkit
- javascript - 为什么 push 不适用于 Map 对象中的 set 方法
- blazor - Blasor WASM 错误没有注册类型的服务
- php - PHP zip 文件在本地下载,但不在生产环境中
- firebase - 我在尝试对数据进行排序时遇到问题
- python - 我可以在不重写代码的情况下更改 Python 对象的 __call__ 吗?
- java - javascript 错误:a.tagName.toUpperCase 不是使用 Selenium 和 Java 单击按钮的函数错误
- c# - 在 Net Core 3.1 MVC 中使用 Ajax 请求触发 IActionResult