Ergebnis 1 bis 7 von 7

[Java] 2D ArrayList

  1. #1 Zitieren
    Tieftöner Avatar von Lookbehind
    Registriert seit
    Dec 2007
    Beiträge
    15.176
    Hi,

    ich merke gerade, dass ich in Java etwas eingerostet zu sein scheine.
    Ich brauche eine Funktion/einen Datentyp der mir bei folgender Aufgabe hilft:
    Aus einer Berechnung mit 2 Werten ergibt sich ein Ergebnis, welches im späteren Programm-Verlauf noch öfters gebraucht werden könnte, daher lohnt es sich, dieses zwischen zu speichern. Um es später wieder eindeutig zuordnen zu können, möchte ich das Ergebnis mit beiden Werten refferenzieren können.
    Beispiel:
    - S1 S2 S3 S4
    S1 - 3 4 5
    S2 3 - 5 6
    S3 4 5 - 7
    S4 5 6 7 -
    Ich möchte dann abfragen können, was das Ergebnis der Rechnung aus den Werten S2 und S4 ist und bekomme 6. Das ganze soll aber auch funktionieren, wenn ich nach dem Ergebnis aus 4 und 2 frage. (Die eigentliche Rechnung ist keine simple Addition, sonst würd sich das abspeichern nicht lohnen )

    So weit so simpel, zweidimensionaler Array und Gut ist... Blöd an dieser Sache, ich weiß im Vorhinein nicht, wie viele Werte ich brauche, und das kann sich zur Laufzeit auch noch ändern.
    Ich weiß, dass ich das Problem mit zwei ineinander geschachtelten ArrayLists erschlagen kann. Aber ich dachte mir, da gibts vielleicht was eleganteres?

    Kennt da jemand eine "schönere" Lösung als verschachtelte ArrayLists?
    Lookbehind ist offline

  2. #2 Zitieren
    Held Avatar von Satans Krümelmonster
    Registriert seit
    Aug 2007
    Beiträge
    5.797
    Nicht so toll an deinem Ansatz finde ich zudem, dass du jeden Wert zwei mal speicherst.

    Ich würde das vielleicht so machen, dass ich die zwei Zahlen S1 und S4 zu einem Wert zusammenführen würde (und zwar so, dass (S1, S4) den gleichen Hash liefert wie (S4, S1)) und das dann in einer HashMap speichern.
    Aber ob es da eine besser Möglichkeit gibt, weiß ich nicht.

    Eine Hash-Funktion für Integer könnte ich mir so vorstellen:

    Code:
    public int hash(int a, int b) {
        return min(a, b) + 65536*max(a, b);
    }
    min und max kommen aus java.lang.Math…

    Da hast du aber natürlich ein Problem, wenn deine Zahlen größer als 216 werden.
    Satans Krümelmonster ist offline

  3. #3 Zitieren
    Tieftöner Avatar von Lookbehind
    Registriert seit
    Dec 2007
    Beiträge
    15.176
    Hm, der Ansatz ist gar nicht so schlecht... vielleicht sogar noch n bisschen simpler.

    Code:
    public string generate_hash(string a, string b) {
        return min(a, b) + ";" + max(a, b);
    }
    Ich bin mir zwar vergleichsweise sicher, dass min und max nicht mit Strings funktionieren, aber es wird etwas vergleichbares geben. Schlimmstenfalls grad nen Quicksort für Strings bauen...

    Danke für die Anregungen
    Lookbehind ist offline

  4. #4 Zitieren
    Knight Commander Avatar von Kellendil
    Registriert seit
    Jul 2009
    Beiträge
    2.101
    Zitat Zitat von Lookbehind Beitrag anzeigen
    Ich bin mir zwar vergleichsweise sicher, dass min und max nicht mit Strings funktionieren, aber es wird etwas vergleichbares geben.
    return (a.compareTo(b) < 0 ? a+";"+b : b+";"+a).hashCode();

    Wenn die Funktion bijektiv wäre, könntest du auch einfach das Ergebnis hashen. Könntest du auch, wenn die Funktion nich bijektiv wäre, aber darunter würde evlt. die Perfromance leiden. Evtl. auch nicht, keine Ahnung, verletzt aber die Empfehlung, hashCode und equals kompatibel zu halten.
    Kellendil ist offline Geändert von Kellendil (18.11.2015 um 17:36 Uhr)

  5. #5 Zitieren
    Tieftöner Avatar von Lookbehind
    Registriert seit
    Dec 2007
    Beiträge
    15.176
    *ausbuddel*
    Noch was
    Ließe sich auch wieder über ArrayList in ArrayList, oder besser ArrayList in HashMap realisieren, aber vielleicht geht das auch anders.
    Ich muss mehrere Elemente zu Gruppen zusammenfassen und dann durch Angabe des Gruppennamens alle Objekte wieder aufrufen können (iterierbar). Die Reihenfolge spielt dabei keine Rolle.
    Problem, es entscheidet sich erst zur Laufzeit wie viele Gruppen es geben wird und wie groß die sind. Mit ziemlicher Sicherheit werden die aber nicht alle gleichgroß. Doppelte Vorkommen sind nicht erlaubt.

    Also sowas:
    G1 G2 G3
    S1 S3 S4
    S2 S5 S6
    S9 S7
    S8
    Und ich möchte durch Angabe von G3 dann die Objekte S4 und S6 bekommen.

    Mein Ansatz wäre sowas:
    Code:
    HashMap<String, ArrayList<MySClass>> myGroups = new HashMap<String, ArrayList<MySClass>>();
    Frage: Geht das eleganter ohne gleich ne SQL-Datenbank dahinter legen zu müssen?
    Lookbehind ist offline

  6. #6 Zitieren
    Knight Commander Avatar von Kellendil
    Registriert seit
    Jul 2009
    Beiträge
    2.101
    Das nennt sich Multimap und ist einer der vielen Gründe, wieso die Google-Guava-Bibliothek schon fast Standard ist in vielen größeren Projekten:

    http://docs.guava-libraries.googleco.../Multimap.html

    Du kannst das auch selber bauen (HashMap mit LinkedList), würde ich aber nicht machen (Spezialfälle, Gruppenlisten initialisieren anlegen etc. macht die HashMultimap alles automatisch).
    Kellendil ist offline Geändert von Kellendil (20.11.2015 um 23:27 Uhr)

  7. #7 Zitieren
    Tieftöner Avatar von Lookbehind
    Registriert seit
    Dec 2007
    Beiträge
    15.176
    Mir kam heute morgen noch eine bessere Idee... Komische Situation... Aufwachen und der erste Gedanke am Morgen ist nicht "Wo ist mein Kaffee?" oder "Welcher Tag ist heute?" sondern "Java ist doch Objektorientiert. Bau doch für die Gruppe ne eigene Klasse. Dann kannst du da auch noch andere Sachen mit einbauen."

    Darauf wirds wohl auch hinaus laufen.
    Lookbehind ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •