我需要什么数据结构来处理这些数据?

问题描述 投票:0回答:1

在回答这个问题之后,我现在面临嵌套组的问题。于是就有了这个问题。

在下面的代码中(这里是Rust Playground)第三个

assert
不起作用,为什么?

另外,我需要在每组之前区分

AND
OR
NOT

我正在努力了解要使用什么数据结构。你能帮我吗?

enum Token {
    Str(&'static str),
    Value(&'static str),
    StartGroup(&'static str),
    EndGroup,
}

fn main() {
    let data: Vec<Vec<Token>> = vec![
        vec![Token::Str("A = "), Token::Value("1")],
        vec![Token::StartGroup(" OR ")],
        vec![Token::Str("B = "), Token::Value("2")],
        vec![Token::Str("C = "), Token::Value("3")],
        vec![Token::Str("D = "), Token::Value("4")],
        vec![Token::EndGroup],
    ];

    assert_eq!(
        "A = 1 AND (B = 2 OR C = 3 OR D = 4)",
        construct_string(data)
    );

    let nested_data: Vec<Vec<Token>> = vec![
        vec![Token::Str("A = "), Token::Value("1")],
        vec![Token::StartGroup(" OR ")],
        vec![Token::Str("E = "), Token::Value("5")],
        vec![Token::Str("F = "), Token::Value("6")],
        vec![Token::Str("G = "), Token::Value("7")],
        vec![Token::EndGroup],
        vec![Token::StartGroup(" AND ")],
        vec![Token::Str("M = "), Token::Value("8")],
        vec![Token::Str("N = "), Token::Value("9")],
        vec![Token::Str("O = "), Token::Value("10")],
        vec![Token::StartGroup(" OR ")],
        vec![Token::Str("B = "), Token::Value("2")],
        vec![Token::Str("C = "), Token::Value("3")],
        vec![Token::EndGroup],
        vec![Token::EndGroup],
    ];

    assert_eq!(
        "A = 1 AND (E = 5 OR F = 6 OR G = 7) AND (M = 8 AND N = 9 AND O = 10 AND (B = 2 OR C = 3))",
        construct_string(nested_data)
    );

    let different_nested_data: Vec<Vec<Token>> = vec![
        vec![Token::Str("A = "), Token::Value("1")],
        vec![Token::StartGroup(" OR ")],
        vec![Token::StartGroup(" OR ")],
        vec![Token::Str("B = "), Token::Value("2")],
        vec![Token::Str("C = "), Token::Value("3")],
        vec![Token::EndGroup],
        vec![Token::Str("E = "), Token::Value("5")],
        vec![Token::Str("F = "), Token::Value("6")],
        vec![Token::Str("G = "), Token::Value("7")],
        vec![Token::EndGroup],
    ];

    assert_eq!(
        "A = 1 AND ((B = 2 OR C = 3) OR E = 5 OR F = 6 OR G = 7)",
        construct_string(different_nested_data)
    );
}

fn construct_string(tokens: Vec<Vec<Token>>) -> String {
    let mut result = String::new();

    let mut next = String::new();
    let mut new_group = true;

    for token in tokens {
        for part in token {
            match part {
                Token::Str(str) => {
                    if !new_group {
                        result.push_str(&next);
                    }
                    new_group = false;
                    result.push_str(str);
                }
                Token::Value(val) => {
                    result.push_str(val);
                }
                Token::StartGroup(group) => {
                    if !new_group {
                        result.push_str(" AND "); // this is wrong, it possibly can also be OR or NOT
                    }
                    result.push_str("(");
                    new_group = true;
                    next = group.to_string();
                }
                Token::EndGroup => {
                    result.push_str(")");
                    next = String::new();
                }
            }
        }
    }

    result
}
loops rust data-structures logic
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.