Zliczanie takich samych elementów List<>

0

Nie wiem czy to przez przemęczenie, ale utknąłem nad takim problemem:

Mam listę stringów i muszę zliczyć powtarzające się elementy, a następnie wyświetlić na konsoli jaki element ile razy się powtórzył.

Z góry dziękuję za pomoc!

0

Najprościej:

  • bierzesz kolejny element z listy
  • w innej pętli przejeżdżasz po liście sprawdzając czy jakiś jej element jest równy szukanemu
  • jeśli tak to zwiększasz licznik
  • jeśli nie to jedziesz dalej

Inna metoda, to zastosowanie funkcji find() listy.

0

A którym miejscu utknąłeś? Wrzuć kawałek kodu - gotowce to nie najlepsze sposoby nauki.

0
allocer napisał(a):

Najprościej:

  • bierzesz kolejny element z listy
  • w innej pętli przejeżdżasz po liście sprawdzając czy jakiś jej element jest równy szukanemu
  • jeśli tak to zwiększasz licznik
  • jeśli nie to jedziesz dalej

Tylko jak zrobić żeby przy kolejnym wykonaniu pętli nie sprawdzało elementów które okazały się być takie same jak pierwszy element? Trzeba by było je od razu usuwać, ale żeby usunąć trzeba by było najpierw odnaleźć indexy tych powtarzających się elementów? Do tego zmieniła by się długość listy i nie wiem jak ta pętla by się zachowała jeżeli jej warunkiem jest n<lista.count?

allocer napisał(a):

Inna metoda, to zastosowanie funkcji find() listy.

Jak wykorzystać find'a?

0

Ty tak poważnie? MSDN otwórz i jazda, co do czego służy.
Elementy możesz usuwać za pomocą np. metody Remove()

Jeśli chcesz mieć szybkie wyszukiwanie (oprócz tego gdy drzewo składa się z jednej gałęzi) i podstawowe operacje w miarę dobrym czasie to zastosuj inną strukturę danych - np. drzewa BST.

2

Skorzystaj ze słownika.

string[] input = { "a", "b", "c", "a", "d", "a" };

var dict = new Dictionary<string,int>();
foreach(var i in input)
    if(dict.ContainsKey(i) )
        dict[i]++;
    else
        dict[i] = 1;

foreach(var d in dict)
    Console.WriteLine("{0} wystepuje {1} razy", d.Key, d.Value); ;

Console.ReadLine();

EDIT: jak chcesz możesz skorzystać z LINQ

foreach(var group in input.GroupBy(s=>s))
    Console.WriteLine("{0} = {1}", group.Key, group.Count());
0

Mała modyfikacja i już jest OK. :)

string u = "";
var dict = new Dictionary<string, int>(); 

foreach (var i in powtFirmy)
    if (dict.ContainsKey(i))
        dict[i]++;
    else
        dict[i] = 1;

foreach (var p in dict)
    if (p.Value == 1)
        u = p.Key;

dict.Remove(u);

foreach (var d in dict)
       Console.WriteLine("{0} wystepuje {1} razy", d.Key, d.Value); 
Console.ReadLine();

1 użytkowników online, w tym zalogowanych: 0, gości: 1