You are not logged in.

  • Login

1

Thursday, November 29th 2007, 4:43pm

Inhalt von Arrays vergleichen

Hi @all,

ich habe folgendes Feld gegeben (4x4-Matrix)

int Matrix [][] = {{34,255,255,56},{127,204,11,34},{123,98,127,34},{34,34,127,17}};

Nun möchte ich die Häufigkeiten feststellen. Also wie oft die einzelnen Zahlen da drin sind (sind ja einige mehrmals vorhanden). Also wie vergleiche ich(jede zahl mit jeder) und wie speichere ich den wert des vergleichs??

dank

LinuxMan88

2

Thursday, November 29th 2007, 4:58pm

Ich hab mal schnell eine Lösung in Java 5 erstellt. Diese ist nicht kommentiert, ich hoffe du kennst dich aus :)
Das Ergebnis wird in einer assoziativen Map gespeichert die als Schlüssel die Zahl hat, und als Wert die Anzahl der Vorkommnisse. Da dort eine TreeMap verwendet wird, ist das Ergebnis gleich nach dem Schlüssel sortiert. Du kannst aber auch eine "normale" HashMap nehmen, nur dass das Ergebnis immer zufällig sortiert ist.
Beim Einfügen in die Map musst du unterscheiden, ob es schon einen Wert gibt, oder ob ein neuer Wert eingefügt wird. Lass dich nicht durch die Verwendung von "Integer.valueOf" abschrecken. Du kannst genauso gut "new Integer" schreiben.

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static void main (final String [] a)
  {
    final int Matrix[][] = { { 34, 255, 255, 56 }, { 127, 204, 11, 34 }, { 123, 98, 127, 34 }, { 34, 34, 127, 17 } };
    final Map <Integer, Integer> aMap = new TreeMap <Integer, Integer> ();
    for (final int [] aVector : Matrix)
      for (final int aValue : aVector)
      {
        Integer aCount = aMap.get (aValue);
        if (aCount == null)
          aCount = Integer.valueOf (1);
        else
          aCount = Integer.valueOf (aCount.intValue () + 1);
        aMap.put (Integer.valueOf (aValue), aCount);
      }
    for (final Map.Entry <Integer, Integer> aEntry : aMap.entrySet ())
      System.out.println (aEntry.getKey () + " kommt " + aEntry.getValue () + " mal vor");
  }

3

Thursday, November 29th 2007, 4:59pm

Hmm, ich würde es wohl ersteinmal so versuchen:

1. Man gehe jede Stelle der Matrix durch (Stichwort for-schleife[n] )
2. Man lege ein dynamisches Feld (Stichwort Vector) an und schaut bei jedem Element ob es schon drin ist. Wenn ja, zählt man einen gewissen Zähler hoch. Wenn nein, speichert man das Element in das Feld rein.
3. Man gebe alle Elemente im Vector mit den dazugehörigen Anzahlen aus (oder was auch immer man damit machen will)

Soviel zu einer (!) möglichen Vorgehensweise. Es gibt sicherlich elegantere Lösungen, aber das wäre zumindest ein Anfang.

Wenn du konkrete Fragen zur Implementierung hast, helf ich auch gern weiter, aber versuch das doch vielleicht erst einmal so...


bye

//EDIT: da war wohl jemand schneller...

4

Thursday, November 29th 2007, 6:01pm

Also die Lösung von phax ist für mich leider zu komplieziert. habe ja nicht davon wenn ich das nicht verstehe. Der Lösungsansatz von mad gefällt mir, benötige aber mal eine belehrung im bezug auf dynamische Felder. da komme ich nicht weiter.


LinuxMan88

5

Thursday, November 29th 2007, 6:05pm

Aber die Grundidee ist recht simpel:
1. Äußeres Array iterieren -- for (int i = 0; i < Matrix.length; i++)
2. Inneres Array iteriere
3. Schauen ob du die Zahl schon hast und entweder den Wert "1" oder "den alten Wert + 1" speichern
4. Anschließend alles ausgeben

6

Thursday, November 29th 2007, 6:42pm

in schritt drei stoppt es bei mir. wie schaue ich denn ob ich die zahl schon habe??

im grund ist das doch durch if ( Matrix == Matrix [j] )

das ganze dann noch schön verpackt in einer for schleife oder ist das total falscher ansatz?

7

Thursday, November 29th 2007, 7:48pm

Das nachschauen, ob du den Wert bereits hast, habe ich mit einer Map umgesetzt.
Eine Map ist ein Container (= ein Objekt das 0-n andere Objekte enthält) der einen Wert einem anderen zuordnet.
So kannst du z.B. abbilden, dass der Wert "D" auf "Deutschland" gemappt wird, und "A" auf "Österreich".
In deinem Beispiel könntest du also den Wert "gefundene Zahl" auf "Anzahl der Vorkommnisse" mappen - alles klar?

Das "dynamische Feld", welches mad angesprochen hat funktioniert wie ein Array, nur das der Inhalt später erweitert werden kann. Deinem Array (Matrix) kannst du, nachdem du es einmal mit Werten belegt hast, keine weiteren Werte hinzufügen!

In welcher Java Version willst du das denn umsetzen? Java 1.4, 1.5 oder 1.6?

8

Thursday, November 29th 2007, 8:27pm

möchte das mit version 1.6 umsetzten. das mit der map klingt recht interessant. werde mich da heute abend noch ein wenig mehr mit beschäftigen.

gruß

linuxman88

Similar threads

Social bookmarks