Abbiamo questa classe C # (sarebbe quasi la stessa in 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;
}
}
Come puoi vedere, l'uguaglianza di due istanze di MyClass
dipende solo da A
. Quindi ci possono essere due istanze che sono uguali, ma che contengono informazioni diverse nella loro proprietà B
.
In una raccolta di raccolte standard di molte lingue (incluso C # e Java, ovviamente) c'è un Set
( HashSet
in C #), che una raccolta, che può contenere al massimo un articolo da ciascun insieme di uguali le istanze.
Si possono aggiungere oggetti, rimuovere oggetti e verificare se il set contiene un oggetto. Ma perché è impossibile ottenere un particolare oggetto dal set?
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
L'unico modo per recuperare il mio oggetto è iterare sull'intera collezione e controllare tutti gli oggetti per l'uguaglianza. Tuttavia, questo richiede O(n)
di tempo anziché O(1)
!
Non ho trovato nessuna lingua che supporti ottenere da un set finora. Tutte le lingue "comuni" che conosco (Java, C #, Python, Scala, Haskell ...) sembrano progettate allo stesso modo: puoi aggiungere elementi, ma non puoi recuperarli. C'è qualche buona ragione per cui tutte queste lingue non supportano qualcosa di così facile e ovviamente utile? Non possono essere tutti completamente sbagliati, giusto? Ci sono lingue che lo supportano? Forse ritirare un particolare oggetto da un set è sbagliato, ma perché?
Ci sono alcune domande SO correlate: