Autor Beitrag
Ogrus
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 08.01.11 08:39 
Hallo zusammen,

Ich habe folgendes Problem. Ich brauche eine Funktion, die mir aus einem Feld von Gleitpunktzahlen (double), den Wert zurück gibt der in dem Feld am häufigsten vorkommt.

Jetzt hat ich schonmal eine Idee, jedoch bin ich denk ich von der Lösung noch weit entfernt.

Bisher hab ich leider nuz:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
static double haeufig ( double [] feld)
{

//dann dachte ich mir dass ich das Feld durchgehen muss, und die werte vom Feld und irgendwie deren Anzahlen in nem zweidimensionalen Feld Speichere, und dann das größte ausgebe



}



Jedoch habe ich nich wirklich ne Ahnung wie ich das in C sharp realisieren soll, und dachte ihr könnt mir dabei helfen =)
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 08.01.11 11:26 
Hallo, also ich würde es so lösen, dass ich die Werte in dem Array erst gruppiere, damm absteigend nach dem Vorkommen sortiere, und danach dann den Wert an der ersten Stelle zurückgeben.
Also in Code so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
static double GetCommonestValue(double[] values)
{
  if (values == null)
    throw new ArgumentNullException("values");
  if (values.Count() == 0)
    throw new ArgumentException("values");
  return values.GroupBy(d => d).OrderByDescending(c => c.Count()).First().Key; 
}


//edit: Wenn mehrere Zahlen (mit unterschiedlichen Werten natürlich) gleich oft vorkommen, so wird der größte Wert davon dann zurückgegeben

LG, Marko
Ogrus Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Sa 08.01.11 11:49 
erstmal danke dafür ^^,

da ich jedoch erst die Grundlagen von C sharp kenne, kann ich mit dem Quelltext leider nich viel anfangen, bzw. ihn verstehen, gibts denn nicht ne einfahere Möglichkeit die häufigste Zahl zu finden ?

bzw. könntest du mir vll den Quelltext den du aufgeschrieben hast erklären ?
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Sa 08.01.11 15:00 
Hallo,

stimmt, ich gebe gerne zu, dass sich der Ausdruck nich ganz von selbst erklärt, besonders nicht als Anfänger.
Habe auch etwas Zeit gebraucht, bis ich den Ausdruck zusammenhatte :wink:

Also, den Ausdruck habe ich nochmal für Anschauungszwecke auseinandergenommen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
//Gruppierung
IEnumerable<IGrouping<doubledouble>> grouped = values.GroupBy(d => d);
//absteigend ordnen
IOrderedEnumerable<IGrouping<doubledouble>> orderedDesc = grouped.OrderByDescending(c => c.Count());
//Rückgabewert
double returnValue = orderedDesc.First().Key;

Das Problem an Deiner Aufgabe ist ja, dass Du Dir irgendwo "merken" musst, wie oft welcher Wert in dem Array ist. Natürlich könnte man das Ganze auch unter Verwendung einens Dictionarys machen, aber das ist als Anfänger (bzw. ich weiß nicht, wieweit Dein Wissen ist) vielleicht auch nicht gerade besser.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Dictionary<doubleint> groupedValues = new Dictionary<doubleint>();
foreach (double value in values)
{
  if (groupedValues.ContainsKey(value))
    groupedValues[value]++;
  else
    groupedValues.Add(value, 1);
}
So, nun hättest Du also alle Werte und die Anzahl, wie oft sie gezählt wurden, im Dictionary. Um nun den meistgezähltesten und den größten zu bekommen, könnte die Auswertung entweder so:
ausblenden C#-Quelltext
1:
2:
double returnValue = groupedValues.Where((x, y) => x.Value == groupedValues.Max(v => v.Value))
                                  .Max(kv => kv.Key);
oder auch nicht so kompliziert aussehen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
KeyValuePair<doubleint> mostcommon = new KeyValuePair<double,int>();
foreach (KeyValuePair<doubleint> value in groupedValues)
{
  if (value.Value > mostcommon.Value)
  {
    //wenn mehr von der Zahl gezählt wurden
    mostcommon = value;
  }
  else if (value.Value == mostcommon.Value && value.Key > mostcommon.Key)
  {
    //wenn genauso viel gezählt wurden, aber der Wert größer ist
    mostcommon = value;
  }
}
double returnValue = mostcommon.Key;
LG, MArko