2017-03-12 17 views
0

私は構造体の2つのベクトルを持っています。それらのリストが同じ長さであり、すべての要素が両方のリストにあることを知る最良の方法は何ですか?順序付けられていないリストの等価性

[foo,bar,baz,beh][beh,foo,baz,bar]と等しいですが、[beh,foo,baz,bar][beh,foo,baz,baz]と等しくはありません。

+0

あなたのリストを並べ替えることができます。もちろん、長さを最初に確認してください。 "[i]!= b [i]がfalseを返した場合、0から' length'までのすべてのiに対してループが終了した場合はtrueを返します。 –

+1

@ YeldarKurmangaliyev手で行う必要はありません。標準スライスの等価性は長さをチェックし、次に項目ごとにチェックします。 – Shepmaster

答えて

3

あなたは重複があることはできないことがわかっている場合、あなたは(あなたの種類に応じて、HashSetまたはBTreeSet)セットを使用することができます。

use std::hash::Hash; 
use std::collections::HashSet; 

fn my_eq<T>(a: &[T], b: &[T]) -> bool 
    where T: Eq + Hash 
{ 
    let a: HashSet<_> = a.iter().collect(); 
    let b: HashSet<_> = b.iter().collect(); 

    a == b 
} 

fn main() { 
    assert!(my_eq(&["foo", "bar", "baz", "beh"], 
        &["beh", "foo", "baz", "bar"])); 
    assert!(!my_eq(&["beh", "foo", "baz", "bar"], 
        &["beh", "foo", "baz", "baz"])); 
} 

あなたは重複を処理する必要がある場合は、カウントしたいと思いますあまりにも値の数:

use std::hash::Hash; 
use std::collections::HashMap; 

fn my_eq<T>(a: &[T], b: &[T]) -> bool 
    where T: Eq + Hash 
{ 
    fn count<T>(items: &[T]) -> HashMap<&T, usize> 
     where T: Eq + Hash 
    { 
     let mut cnt = HashMap::new(); 
     for i in items { *cnt.entry(i).or_insert(0) += 1 } 
     cnt 
    } 

    count(a) == count(b) 
} 

fn main() { 
    assert!(my_eq(&["foo", "foo", "baz", "beh"], 
        &["beh", "foo", "baz", "foo"])); 
    assert!(!my_eq(&["foo", "foo", "baz", "beh"], 
        &["beh", "foo", "baz"])); 
} 

あなたはスーパー空想になりたい場合は、あなたが直接、平等のこのタイプを追加のnewtype作成することができます。

を3210
use std::hash::Hash; 
use std::collections::HashMap; 

#[derive(Debug, Copy, Clone)] 
struct CustomEq<'a, T: 'a>(&'a [T]); 

impl<'a, T> CustomEq<'a, T> 
    where T: Eq + Hash 
{ 
    fn count(&self) -> HashMap<&T, usize> { 
     let mut cnt = HashMap::new(); 
     for i in self.0 { 
      *cnt.entry(i).or_insert(0) += 1 
     } 
     cnt 
    } 
} 

impl<'a, T> PartialEq for CustomEq<'a, T> 
    where T: Eq + Hash 
{ 
    fn eq(&self, other: &Self) -> bool { 
     self.count() == other.count() 
    } 
} 

fn main() { 
    assert_eq!(CustomEq(&["foo", "bar", "baz", "beh"]), 
       CustomEq(&["beh", "foo", "baz", "bar"])); 
    assert_ne!(CustomEq(&["beh", "foo", "baz", "bar"]), 
       CustomEq(&["beh", "foo", "baz", "baz"])); 
} 
関連する問題