Java 如何在枚举上迭代,将其插入向量,然后在向量中洗牌?

Java 如何在枚举上迭代,将其插入向量,然后在向量中洗牌?,java,rust,Java,Rust,我正在编写代码来初始化52张牌并洗牌。在Java中,我使用一个ArrayList并遍历suite枚举和Rank枚举,同时添加一个Cardsuit,Rank对象。然后我使用Collections.shuffle 我正在尝试使用向量和结构将此代码移植到Rust。问题是我不能像在Java中那样迭代枚举。达到这个结果的惯用方法是什么 我曾尝试导入strum&strum_宏以获得enum迭代,但我一直在尝试将结构推送到Vec上,然后随机洗牌 Java代码 公务舱甲板{ 私有列表aCards=newarra

我正在编写代码来初始化52张牌并洗牌。在Java中,我使用一个ArrayList并遍历suite枚举和Rank枚举,同时添加一个Cardsuit,Rank对象。然后我使用Collections.shuffle

我正在尝试使用向量和结构将此代码移植到Rust。问题是我不能像在Java中那样迭代枚举。达到这个结果的惯用方法是什么

我曾尝试导入strum&strum_宏以获得enum迭代,但我一直在尝试将结构推送到Vec上,然后随机洗牌

Java代码

公务舱甲板{ 私有列表aCards=newarraylist<>; 公共甲板{ 洗牌 } 公共空间洗牌{ aCards.clear; 对于西服:Suit.values{ 对于等级:Rank.values{ aCards.addnew Cardrank,套装; } } 收藏。洗牌; } } 防锈试验

使用板条箱::卡片::卡片; 使用板条箱::秩::秩; 使用板条箱::套装::套装; 使用rand::{thread_rng,rng}; 使用strum::IntoEnumIterator; 酒吧结构甲板{ 卡片:Vec, } impl甲板{ pub fn shuffle和mut self->{ self.cards.clear; 国际热核聚变实验堆{ 对于秩中的r::iter{ self.cards.pushCard::news,r; } } } } 西服等级的结构类似

使用strum_宏::*; [deriveEnumIter,调试] 酒吧枚举诉讼{ 黑桃, 钻石, 俱乐部, 心, } 卡片结构

发布结构卡{ 西装:西装, 等级:等级, } impl卡{ pub fn newpsuit:套装,恶作剧:等级->卡片{ 卡片{ 西服:psuit,, 排名:恶作剧, } } } 我只想简单地通过两组枚举变量进行迭代,然后洗牌输出对,但这似乎要复杂得多!我想也许有更好的方法?

关键点是:

为rand版本0.7引入随机洗牌所需的特性。 将enum::iter所需的类型纳入范围 Cargo.toml:

[package]
name = "mcve"
version = "0.1.0"
authors = ["Svetlin Zarev <svetlin.zarev@xxx.com>"]
edition = "2018"

[dependencies]
strum = "0.15"
strum_macros = "0.15"
rand = "0.7.0"
main.rs:

use strum_macros::EnumIter; // etc.
use strum::IntoEnumIterator;
use rand::thread_rng;
use rand::seq::SliceRandom;

#[derive(Debug, Copy, Clone,EnumIter)]
enum Suit {
    DIAMONDS,
    HEARTS,
    CLUBS,
    SPADES,
}

#[derive(Debug, Copy, Clone, EnumIter)]
enum Rank {
    Ace,
    King,
    Queen,
    Jack,
}

#[derive(Debug)]
struct Card {
    suit: Suit,
    rank: Rank,
}

impl Card {
    fn new(suit: Suit, rank: Rank) -> Card {
        Card { suit, rank }
    }
}

fn main() {
    let mut cards = Vec::<Card>::new();

    for r in Rank::iter() {
        for s in Suit::iter() {
            cards.push(Card::new(s, r));
        }
    }

    let mut rng = thread_rng();
    cards.shuffle(&mut rng);

    println!("{:?}", cards);
}
正如您所看到的,这几乎就像在Java中一样。唯一的区别是有些方法不是来自结构,而是来自Rust中的接口,这些方法称为trait,您必须导入它们才能使用它们