มามีคลาส 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
รองรับการดึงข้อมูลวัตถุดังนั้นภาษา "ทั่วไป" ไม่เหมือนทุกภาษาที่คุณอธิบาย