Ho problemi nel conteggio dei valori univoci in un array e ho bisogno di farlo senza riorganizzare gli elementi dell'array.Come posso contare i numeri univoci in un array senza riorganizzare gli elementi dell'array?
Come posso realizzare questo?
Ho problemi nel conteggio dei valori univoci in un array e ho bisogno di farlo senza riorganizzare gli elementi dell'array.Come posso contare i numeri univoci in un array senza riorganizzare gli elementi dell'array?
Come posso realizzare questo?
Se si dispone di .NET 3.5 si può facilmente raggiungere questo obiettivo con LINQ tramite:
int numberOfElements = myArray.Distinct().Count();
non LINQ:
List<int> uniqueValues = new List<int>();
for(int i = 0; i < myArray.Length; ++i)
{
if(!uniqueValues.Contains(myArray[i]))
uniqueValues.Add(myArray[i]);
}
int numberOfElements = uniqueValues.Count;
Se questa è una domanda per i compiti a casa, la risposta non è la stessa per ottenere molti punti ma una buona risposta in termini di linq. – andleer
@Andrew Aggiunto un esempio di lavoro non LINQ. –
L'esempio di non-linq è davvero pessimo, ma lascia che Rich B trovi una soluzione migliore se è davvero una domanda sui compiti. :) (SUGGERIMENTO: come evitare di dover eseguire un'iterazione sull'intera matrice per ciascun articolo?) – Arafangion
Questa è un'implementazione non LINQ molto più efficiente.
var array = new int[] { 1, 2, 3, 3, 3, 4 };
// .Net 3.0 - use Dictionary<int, bool>
// .Net 1.1 - use Hashtable
var set = new HashSet<int>();
foreach (var item in array) {
if (!set.Contains(item)) set.Add(item);
}
Console.WriteLine("There are {0} distinct values. ", set.Count);
Perché
Le prestazioni dovrebbero essere identiche, lo puliscono per usare HashSet, quindi questo codice demo sembra meno brutto –
Il dizionario contiene dovrebbe essere molto più veloce su array di grandi dimensioni di quanto non contenga l'Elenco. –
caso solo i valori distinti essere imputate o dovrebbe ciascun numero nell'array essere contati (ad esempio "numero 5 è contenuto 3 volte")?
Il secondo requisito può essere soddisfatto con le fasi iniziali dell'algoritmo di calcolo del conteggio.
Sarebbe qualcosa di simile:
saluti
utilizzo O (n) in esecuzione tempo di memoria MAX_VALUE
boolean[] data = new boolean[maxValue];
for (int n : list) {
if (data[n]) counter++
else data[n] = true;
}
è questo compito? –
he he kinda; P .... – jarus
Niente di sbagliato con i compiti ... A condizione che uno non prenda solo le risposte come sono. (ad esempio, prendi la risposta e rendila * migliore *). – Arafangion