Domanda

Ho un implementazione coda di priorità in C # che voglio aggiungere un metodo .IndexOf a.

Tuttavia, dal momento che la coda di priorità non si riguarda in realtà con l'ordine dei valori stessi (vale a dire, se dovessi prendere solo tutti i valori, trascurando le loro priorità, che non sarebbe necessariamente un ordine a tutti ), solo la priorità di loro, non ho alcun criterio per il tipo generico T della coda di priorità, vale a dire, io non specificare che hanno bisogno di avere un po 'di ordine intrinseco, o comparabilità .

In quanto tale, quando sono venuto a implementare .IndexOf(T value) Ho un problema minore.

C'è uno standard di cosa / come dovrei implementare questo? I miei pensieri iniziali era semplicemente quello di utilizzare EqualityComparer<T>.Default per capire se ho trovato il value o no, ma poi ci sono tanti simili tali tipi di questi giorni.

Per esempio, ecco cosa mi è venuta a coprire la mia base, ma questo sembra eccessivo:

  • public Int32 IndexOf(T value) (chiama internamente uno degli altri con ClassThatImplementsInterface.Default)
  • public Int32 IndexOf(T value, IComparer<T> comparer)
  • public Int32 IndexOf(T value, IEqualityComparer<T> comparer)
  • public Int32 IndexOf(T value, IEquatable<T> comparer)
  • public Int32 IndexOf(T value, Predicate<T> predicate)

Che cosa fate? Marcatura questo come sia soggettiva e wiki come questo è più di un sondaggio di opinione di ogni altra cosa.

On rileggendo la mia domanda credo che posso solo usare l'uno senza un operatore di confronto, e quindi aggiungere la versione predicato, in questo modo l'utente di questa classe può chiamare qualsiasi cosa.

Si noti inoltre che posso anche fare pq[index] per entrare in possesso di un oggetto che contiene sia la priorità e il valore in sé, così ho potuto anche fare a meno IndexOf a tutti, ma mi piacerebbe anche avere metodi che dice < em> modificare la priorità del valore di X alla priorità P , che richiederebbe una qualche forma di IndexOf / ricerca internamente. E così mi piacerebbe anche per evitare di dover avere ennesime sovraccarichi di tutti questi metodi pure.


risposta al commento :. Sì, la coda di priorità si basa su un mucchio

In sostanza, le due classi sono definite in questo modo:

public class Heap<T> : IEnumerable<T>, ICloneable { ... }
public class PriorityQueue<T> : Heap<PriorityQueueElement<T>> { ... }

PriorityQueueElement è una semplice struttura immutabile, con priorità e valore proprietà.

La risposta al prossimo commento : Dal momento che la coda di priorità si basa su un mucchio, una "proprietà interessante" è che cambiando la priorità di un valore attraverso il suo indice significa che in seguito, il valore ha vinto' t necessariamente essere a tale indice. Intendo proprio documento Questo come in alcuni casi prevedo la necessità di operazioni di individuare / cambio di priorità indipendenti.

È stato utile?

Soluzione

Vorrei fare il paragone di un parametro del costruttore facoltativo; questo è paragonabile a come le cose come Dictionary<,>, SortedList<,> ecc consentono di specificare il meccanismo di confronto.

Sia per accetta un IComparer<T> o un IEqualityComparer<T> dipende dal fatto che si sta per ordinare i dati, o semplicemente cercare una parità di corrispondenza; Se la partita, allora avrete bisogno di qualcosa di simile IEqualityComparer<T>. Purtroppo, dal momento che questo ha 2 metodi (GetHashCode() e Equals()) non esiste una versione diretta delegato di questo, tranne forse Predicate<T> o Func<T,T,bool>.

Per il costruttore di default, mi piacerebbe passare nel [Equality]Comparer<T>.Default.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top