如何更简便地检查Rust二维数组中是否存在相等元素?
如何更简便地检查Rust二维数组中是否存在相等元素?
嘿,这个问题我来帮你搞定!你现在是要检查Zobrist哈希表的随机值数组里有没有重复元素对吧?虽然u64随机值重复的概率极低,但初始化时做个校验确实很稳妥。
这里给你一个简洁高效的实现思路:把二维数组摊平成一维迭代器,用HashSet来跟踪已经出现过的值,一旦发现重复就立刻返回结果,不用遍历完所有元素。
具体代码如下:
use std::collections::HashSet; // 检查二维数组中是否存在重复元素 fn has_duplicates(arr: &[[u64; 64]; 12]) -> bool { let mut seen = HashSet::new(); // 把二维数组摊平成一维迭代器,逐个检查元素 arr.iter() .flat_map(|row| row.iter()) .any(|&val| !seen.insert(val)) } // 调用示例 // fn main() { // let mut zobrist_pieces = [[0u64; 64]; 12]; // // 假设这里已经用rng填充了随机值 // if has_duplicates(&zobrist_pieces) { // println!("数组里有重复元素!"); // } else { // println!("所有元素都是唯一的!"); // } // }
简单解释下这个逻辑:
flat_map(|row| row.iter())把二维数组的每一行都拆成单个元素的迭代器,相当于把整个二维数组“拍扁”成一维序列。any方法会遍历每个元素,调用seen.insert(val):HashSet的insert方法如果返回false,说明这个值已经在集合里存在过——也就是找到了重复元素,此时any会立刻停止遍历并返回true,非常高效。- 如果遍历完所有元素都没有重复,
any就会返回false。
要是你还想收集所有重复的元素,可以改用HashMap来统计每个值出现的次数,但如果只是需要判断“有没有重复”,上面的方法已经足够简洁高效啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

