0
私は構造体の2つのベクトルを持っています。それらのリストが同じ長さであり、すべての要素が両方のリストにあることを知る最良の方法は何ですか?順序付けられていないリストの等価性
[foo,bar,baz,beh]
は[beh,foo,baz,bar]
と等しいですが、[beh,foo,baz,bar]
は[beh,foo,baz,baz]
と等しくはありません。
私は構造体の2つのベクトルを持っています。それらのリストが同じ長さであり、すべての要素が両方のリストにあることを知る最良の方法は何ですか?順序付けられていないリストの等価性
[foo,bar,baz,beh]
は[beh,foo,baz,bar]
と等しいですが、[beh,foo,baz,bar]
は[beh,foo,baz,baz]
と等しくはありません。
あなたは重複があることはできないことがわかっている場合、あなたは(あなたの種類に応じて、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作成することができます。
を3210use 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"]));
}
あなたのリストを並べ替えることができます。もちろん、長さを最初に確認してください。 "[i]!= b [i]がfalseを返した場合、0から' length'までのすべてのiに対してループが終了した場合はtrueを返します。 –
@ YeldarKurmangaliyev手で行う必要はありません。標準スライスの等価性は長さをチェックし、次に項目ごとにチェックします。 – Shepmaster