삽입 순서를 유지하는 (Vec을 생각하는) 고유 한 값만 추적하는 유형 (HashSet을 생각해 보라)이 있습니까? 삽입 전에 값이 존재하는지 먼저 확인해야하기 때문에 Vec
을 사용하지 않는 것이 좋습니다.삽입 순서를 유지하는 집합 유형
1
A
답변
1
linked_hash_set
크레이트가 현재 제공됩니다. 가능한 한 가깝게 HashSet
API를 미러링하여 linked-hash-map
을 기반으로합니다.
extern crate linked_hash_set;
use linked_hash_set::LinkedHashSet;
let mut set = LinkedHashSet::new();
set.insert(234);
set.insert(123);
set.insert(345);
set.insert(123);
assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![234, 345, 123]);
3
linked-hash-map
crate는 키 - 값 삽입 순서를 유지하는 해시 맵을 제공합니다.
extern crate linked_hash_map;
use linked_hash_map::*;
use std::collections::hash_map::RandomState;
use std::hash::{BuildHasher, Hash};
use std::borrow::Borrow;
fn main() {
let mut s = LinkedHashSet::new();
s.insert(5);
s.insert(3);
s.insert(7);
s.insert(1);
assert_eq!(vec![5, 3, 7, 1], s.iter().cloned().collect::<Vec<_>>());
s.remove(&7);
assert_eq!(vec![5, 3, 1], s.iter().cloned().collect::<Vec<_>>());
s.remove(&5);
assert_eq!(vec![3, 1], s.iter().cloned().collect::<Vec<_>>());
}
pub struct LinkedHashSet<K, S = RandomState>(LinkedHashMap<K,(), S>);
impl<K: Hash + Eq> LinkedHashSet<K> {
pub fn new() -> Self {
LinkedHashSet(LinkedHashMap::new())
}
}
impl<K: Hash + Eq, S: BuildHasher> LinkedHashSet<K, S> {
pub fn insert(&mut self, k: K) -> Option<()> {
self.0.insert(k,())
}
pub fn contains<Q: ?Sized>(&self, k: &Q) -> bool
where K: Borrow<Q>,
Q: Eq + Hash
{
self.0.contains_key(k)
}
pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<()>
where K: Borrow<Q>,
Q: Eq + Hash
{
self.0.remove(k)
}
pub fn iter(&self) -> Keys<K,()> {
self.0.keys()
}
}
당신은 다른 방법을 구현할 수 있습니다 : 우리는 값으로 ()
를 사용하여이 해시 맵에 대한 일련의 래퍼 (std::collections::HashSet
이 방법을 구현) 만들 수 있습니다. LinkedHashMap
docs을 참조하십시오.
관련 문제
- 1. 삽입 순서를 유지하는 콜렉션을 설정하십시오.
- 2. 삽입 순서를 유지하는 Infinispan 캐시
- 3. UUID를 사용하여 삽입 순서를 유지하는 방법
- 4. 삽입 순서를 유지하는 불규칙 스칼라 맵 구현
- 5. 삽입 순서를 유지하는 C + 11 연관 컨테이너?
- 6. 삽입 순서를 유지하는 스레드 안전 맵
- 7. 연결된 Hashmap이 삽입 순서를 유지하는 방법
- 8. 순서를 유지하는 HashSet
- 9. SQL 쿼리의 순서를 유지하는 방법
- 10. SqlBulkCopy로 행 순서를 유지하는 방법?
- 11. 순서를 유지하는 키/값 컬렉션
- 12. yaml에 파일을로드 할 때 키 삽입 순서를 유지하는 방법은 무엇입니까?
- 13. Meteor에서 타임 스탬프를 사용하고 삽입 순서를 유지하는 방법은 무엇입니까?
- 14. 삽입 순서를 유지하는 불변의 키 - 값 구조가 필요합니다.
- 15. 순서를 유지하면서 배열을 계산 (집합)
- 16. 순서를 유지하는 가능한 사전을 만드십시오
- 17. TestNG에서 그룹 순서를 유지하는 방법
- 18. RealmObject의 RealmList입니다. 순서를 유지하는 방법?
- 19. RequireJS에서 스크립트로드 순서를 유지하는 방법
- 20. 데이터베이스의 레코드 순서를 유지하는 방법
- 21. 행을 최대 값으로 유지하는 집합
- 22. dataprovider에서 데이터 순서를 유지하는 방법은 무엇입니까?
- 23. 삽입 순서 목록 집합
- 24. 스칼라 HashMap : 삽입 순서를 반복 하시겠습니까?
- 25. 삽입 순서를 추적하는 std :: map?
- 26. primefaces datatable의 정렬 순서를 유지하는 방법은 무엇입니까?
- 27. 각 세션에서 동일한 순서를 유지하는 방법은 무엇입니까?
- 28. finditer()를 사용하여 순서를 유지하는 방법
- 29. 감속기에서 MapWritable의 순서를 유지하는 방법은 무엇입니까?
- 30. 도움말 섹션에서 인수 순서를 유지하는 방법은 무엇입니까?
[linked-hash-map] (https://crates.io/crates/linked-hash-map) 상자를 보았습니까? 어쩌면'V =()'로 랩을 만들 수 있습니다. – malbarbo
기본적으로 세트로 사용되는 http://stackoverflow.com/q/30243100/155423의 복제본은 가치가없는 단지지도입니다. – Shepmaster
필요한 변경 사항은 요소 추가 및 요소 복사 만 가능한 경우 집합 및 벡터를 모두 사용하고 중복 검사에 대한 집합 및 요소를 순서대로 저장하는 벡터를 사용하면됩니다. – CodesInChaos