Laden...

Zweidimensionales Array sortieren

Erstellt von Taxi4110 vor 18 Jahren Letzter Beitrag vor 16 Jahren 17.867 Views
T
Taxi4110 Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren
Zweidimensionales Array sortieren

Hallo,

ich hab ein kleines Problem mit einem Array[,] das ich irgendwie sortieren/zusammenfassen muss. Das Array sieht folgendermaßen aus:

string[,] array = new string[x,2];

In einer Schleife fülle ich nun das Array. Das sieht dann so aus:


array[y, z] = id[i];
z++;
array[y, z] = wert[i];
z = 0;
y++;

Also hab ich jetzt ein Array das so aussieht:
| ID | Wert |
|23 | 3422 |
|23 | 5212 |
|46 | 938 |
|46 | 4354 |
|46 | 332 |
|8 | 454 |
usw...

Jetzt das Problem: Ich will alle Werte für eine ID zusammenzählen und diese in ein neues Array[,] speichern. Das das mit einem String Array nicht funktioniert, ist mir schon klar. Das zweite Array sollte dann so aussehen:

| ID | WERT |
|23 | 8634 |
|46 | 5624 |
|8 | 454 |

Für einen Lösungsansatz wäre ich wirklich dankbar!

1.549 Beiträge seit 2004
vor 18 Jahren

Du kannst das Array durchgehen und die ID des Aktuellen und des nächsten Feldes vergleichen wenn sie gleich sind addieren und ins neue Array schreiben

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

T
Taxi4110 Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

Verstehe ich nicht ganz... 🤔 wie sollte der quelltext dazu aussehen?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Taxi4110,

nimm eine Hashtable und summiere schon beim Hinzufügen. Nachher brauchst du dann nur die Keys zu sortieren (eindimensionales Array; Array.Sort).

herbivore

B
119 Beiträge seit 2005
vor 18 Jahren

Wenn du die Summe der einzelnen "ID-Arrays" nur ab und an mal brauchst aber das 2-dimensionale Array ansich
relativ oft, wär es (so finde ich halt) fast am einfachsten du machst ein 1-dimensionales draus. Zum Beispiel so:


using System.Collections.Generic;

public struct DataObject : IComparable<DataObject>
{
    private int value;
    private int id;

    // Properties, etc. spar ich mir jetzt mal .. 

    public int CompareTo(DataObj obj) {
        return id.CompareTo(obj.id);
    }
}

Jetzt kannst das DataObject-Array ebenfalls ganz leicht mit Array.Sort sortieren und musst
halt nur noch die Additionen vornehmen, was nicht viel mehr als eine Schleife ist.

Wenn du allerdings nur diese komische Summe benötigst, wäre herbivores Vorschlag sicher angemessener.

grüße

T
Taxi4110 Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

hashtable kommt jetzt für mich nicht in frage. das muss doch auch anders gehen, oder?!

1.549 Beiträge seit 2004
vor 18 Jahren

Ja ganz einfach du kannst doch sicher ein Array Sortieren wenn du es dann nach der ID Nummer Sortiert hast kannst du das Array durchgehen und die Werte mit gleicher ID Addieren und in ein Neues Array Schreiben

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

T
Taxi4110 Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

also... soweit bin ich jetzt schonmal. in das neue array strada[,] soll das resultat geschrieben werden (siehe erster post, ganz unten). in das array tempid[] schreibe ich alle IDS rein. theoretisch müsste er jetzt jedes mal das array tempid durchsuchen, ob die ID darin schon existiert. wenn ja, holt er sich den wert strada[i,1], addiert ihn mit dem des arrays myarray und schreibt ihn wieder in das array strada.
leider bekomm ich immer einen fehler (Index außerhalb des Arraybereichs) in der zeile, die ich markiert habe. vielleicht könnt ihr mir bisschen helfen!


int a = 0;
int b = 0;
int calc = 0;
string[,] strada = new string[5,2];
string[] tempid = new string[details.Count];

for (int i = 0; i < details.Count; i++)
			{
				Array.Sort(tempid);
				object obj1 = myarray[i,0];
				int retval = Array.BinarySearch(tempid, obj1);
				if (retval >= 0)
				{
					tempid[i] = "got";
					calc = Convert.ToInt32(strada[retval, 1]); //FEHLER
					calc = calc + Convert.ToInt32(myarray[i,1]);
					strada[retval, 1] = calc.ToString();
				}
				else
				{
					tempid[i] = myarray[i,0];
					strada[a, b] = myarray[i,0];
					b++;
					strada[a, b] = myarray[i,1];
					b = 0;
					a++;
				}
			}
			return strada;

achja, in myarray[,] sind alle ids und werte enthalten wie beim ersten post oben die erste tabelle.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Taxi4110,

mir ist nicht ganz klar, was dein Code ganau machst. Aber wenn du bei der zweidimensionalen-Array-Varianten bleiben willst, musst du ja beide Arrays parallel sortieren. Und dafür gibt es m.E. nichts vorgegebenes, d.h. du musst den ganzen Sortieralgorithmus selbst schreiben. Davon möchte ich dringend abraten.

Wenn du meinen Vorschlag von oben nicht umsetzen willst, dann pack alles wie gehabt in das zweidimensionale Array, aber benutzte für den Sortierungsschritt die Hashtable wie oben beschrieben.

herbivore

P
939 Beiträge seit 2003
vor 18 Jahren

Hi Taxi4110,

ich würde es so machen wie Bernhard es vorschlägt.
Ersetz' das zweidimensionale Array durch ein eindimensionales, das Datenobjekte hält. Eindimensionale Arrays können leicht per Array.Sort und IComparer sortiert werden.

Wenn es von der Logik her eher eine Matrix ist und keine Liste von Objekten, kannst du auch ein geschachteltes Array verwenden (geschachtelte Arrays sind ohnehin den mehrdimensionalen Arrays vorzuziehen).

Ich hab es testweise mal programmiert, ist gar nicht mal so viel Code:

private const int COL_ID = 0;  // Index ID-Spalte
private const int COL_SUM = 1; // Index Sum-Spalte

// Table nach ID-Spalte gruppieren und aufsummieren.
// Statt int[,] wird int[][] verwendet.
static int[][] SumByID(int[][] table) {
   ArrayList result = new ArrayList();

   // table nach ID-Spalte sortieren  (Index 0).
   Array.Sort(table, new IdComparer());

   // table nach ID-Spalte aufsummieren.
   int[] resultRow = null;
   foreach(int[] row in table) {

      // Für jede ID eine neue Reihe 
      // zum Ergebnis hinzufügen.
      if(resultRow == null || 
         resultRow[COL_ID] != row[COL_ID]) {

         resultRow = new int[] { row[COL_ID], 0 };
         result.Add(resultRow);
      }

      // Aufsummieren.
      resultRow[COL_SUM] += row[COL_SUM];
   }

   // Ergebnis als Array zurückgeben.
   int[][] array = (int[][])result.ToArray(typeof(int[]));
   return array;
}

// IdComparer zum Sortieren nach ID-Spalte (Index 0).
class IdComparer : IComparer {

   public int Compare(object a, object b) {
      int[] rowA = (int[])a;
      int[] rowB = (int[])b;
      int v = Compare(rowA, rowB);
      return v;
   }

   public int Compare(int[] a, int[] b) {
      int v = a[COL_ID] - b[COL_ID];
      return v;
   }
}

Ich hab das komplette Beispiel angehängt.

Gruss
Pulpapex

T
Taxi4110 Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

respekt!!! 👍 ich werde das gleich mal einbauen und testen. danke dir!

M
16 Beiträge seit 2007
vor 16 Jahren

-fred rauskram-
würde hier gerne mal nachhaken: wie würde denn die syntax aussehen für eine liste von listen? struktur sollte eine simple list<int> seien, die ihrerseits in einer list enthalten ist..?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo moeb1us,

List <List <int>>

herbivore

M
16 Beiträge seit 2007
vor 16 Jahren

bedankt 🙂