【问题标题】:How can slices be split using another slice as a delimiter?如何使用另一个切片作为分隔符来分割切片?
【发布时间】:2016-08-08 05:10:31
【问题描述】:

标准库是否提供了一种方法来分割一个切片 [T] 使用另一个相同类型的切片作为分隔符?该库的文档列出了对单元素分隔符而不是切片进行操作的方法。

例如:5 个u64 整数[1u64, 4u64, 0u64, 0u64, 8u64] 的切片使用[0u64, 0u64] 作为分隔符将产生两个切片[1u64, 4u64][8u64]

【问题讨论】:

    标签: rust


    【解决方案1】:

    标准库是否提供了一种使用相同类型的另一个切片作为分隔符来拆分切片[T] 的方法?

    从 Rust 1.9 开始,没有,但你可以实现它:

    fn main() {
        let a = [1, 4, 7, 0, 0, 8, 10, 0, 0];
        let b = [0, 0];
        let mut iter = split_subsequence(&a, &b);
        assert_eq!(&[1, 4, 7], iter.next().unwrap());
        assert_eq!(&[8, 10], iter.next().unwrap());
        assert!(iter.next().unwrap().is_empty());
        assert_eq!(None, iter.next());
    }
    
    pub struct SplitSubsequence<'a, 'b, T: 'a + 'b> {
        slice: &'a [T],
        needle: &'b [T],
        ended: bool,
    }
    
    impl<'a, 'b, T: 'a + 'b + PartialEq> Iterator for SplitSubsequence<'a, 'b, T> {
        type Item = &'a [T];
    
        fn next(&mut self) -> Option<Self::Item> {
            if self.ended {
                None
            } else if self.slice.is_empty() {
                self.ended = true;
                Some(self.slice)
            } else if let Some(p) = self.slice
                                        .windows(self.needle.len())
                                        .position(|w| w == self.needle) {
                let item = &self.slice[..p];
                self.slice = &self.slice[p + self.needle.len()..];
                Some(item)
            } else {
                let item = self.slice;
                self.slice = &self.slice[self.slice.len() - 1..];
                Some(item)
            }
        }
    }
    
    fn split_subsequence<'a, 'b, T>(slice: &'a [T], needle: &'b [T]) -> SplitSubsequence<'a, 'b, T>
        where T: 'a + 'b + PartialEq
    {
        SplitSubsequence {
            slice: slice,
            needle: needle,
            ended: false,
        }
    }
    

    请注意,此实现使用naive 算法来查找相等的子序列。

    【讨论】:

    • 我相信天真的算法是 O(n^2),这是它没有包含在标准库中的部分原因。
    • 这就是我最终所做的。 +1 花时间用实现来说明您的响应。
    猜你喜欢
    • 2019-12-22
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多