이 C # 클래스를 사용합시다 (Java에서 거의 동일 함)
public class MyClass {
public string A {get; set;}
public string B {get; set;}
public override bool Equals(object obj) {
var item = obj as MyClass;
if (item == null || this.A == null || item.A == null)
{
return false;
}
return this.A.equals(item.A);
}
public override int GetHashCode() {
return A != null ? A.GetHashCode() : 0;
}
}
보시다시피, 두 인스턴스의 동등성은 에만 MyClass
의존 A
합니다. 따라서 동일하지만 B
속성 에 서로 다른 정보를 보유하는 두 개의 인스턴스가있을 수 있습니다 .
많은 언어 (물론 C # 및 Java 포함)의 표준 컬렉션 라이브러리에는 Set
( HashSet
C #에) 컬렉션이 있습니다.이 컬렉션은 각 동일한 인스턴스 집합에서 최대 하나의 항목을 보유 할 수 있습니다.
항목을 추가하고, 제거하고, 세트에 항목이 포함되어 있는지 확인할 수 있습니다. 그러나 세트에서 특정 품목을 얻는 것이 왜 불가능합니까?
HashSet<MyClass> mset = new HashSet<MyClass>();
mset.Add(new MyClass {A = "Hello", B = "Bye"});
//I can do this
if (mset.Contains(new MyClass {A = "Hello", B = "See you"})) {
//something
}
//But I cannot do this, because Get does not exist!!!
MyClass item = mset.Get(new MyClass {A = "Hello", B = "See you"});
Console.WriteLine(item.B); //should print Bye
내 항목을 검색하는 유일한 방법은 전체 컬렉션을 반복하고 모든 항목이 동일한 지 확인하는 것입니다. 그러나, O(n)
대신에 시간 이 걸립니다 O(1)
!
지금까지 세트에서 얻을 수있는 언어를 찾지 못했습니다. 내가 아는 모든 "공통"언어 (Java, C #, Python, Scala, Haskell ...)는 같은 방식으로 디자인 된 것 같습니다. 항목을 추가 할 수는 있지만 검색 할 수는 없습니다. 이 모든 언어가 쉽고 분명한 기능을 지원하지 않는 이유가 있습니까? 그들은 모두 잘못 될 수 없습니다. 그것을 지원하는 언어가 있습니까? 어쩌면 세트에서 특정 아이템을 가져 오는 것이 잘못되었을 수 있지만 왜 그런가요?
SO 관련 몇 가지 질문이 있습니다.
/programming/7283338/getting-an-element-from-a-set
/programming/7760364/how-to-retrieve-actual-item-from-hashsett
Set<E>
구현이 Map<E,Boolean>
내부에 있습니다.
a == b
경우에 따라 반사성을 깨뜨립니다 ( 항상 참) this.A == null
. if (item == null || this.A == null || item.A == null)
테스트 가능성이 인위적으로 "고품질"코드를 생성하기 위해, 많은을 "과장"를 확인합니다. 코드 검토에서 이러한 종류의 "과도하게 검사"하고 항상 올바르게 수정하는 것을 볼 수 있습니다.
std::set
은 객체 검색을 지원하므로 모든 "공통"언어가 설명하는 것과는 다릅니다.