Frage zu Datentyp

Status
Nicht offen für weitere Antworten.

schmiddy123

Mitglied
Hallo,

ich habe Daten, die ich in einem Int-Array speichere (z.B. [0,1,1,0,2,0,0,1]). Zu jedem solchem Array gibt es einen Int-Wert, ich will jetzt möglichst effizient für jedes Array diesen Wert speichern. Also ich habe z.B.

[0,1,1,0,2,0,0,1] : 10
[1,1,1,1,1,0,0,1] : 5
[2,1,1,2,2,2,2,1] : 14

Ich habe mir gedacht ich mache es mittels einer Hashmap, damit ich leicht auf die Zahl zugreifen kann, die zu einem bestimmten Array gehört.

Wenn ich aber folgendes mache:

hashmap.put("array als key", "zahl als value");

und dann

hashmap.get("array");

dann kriege ich nie den Wert für ein Array raus, auch wenn dieses schon enthalten ist. Ich denke das Problem ist, dass das Array als Objekt darin gespeichert ist, und das neue Array ein anderes Objekt ist, das dann nicht als Schlüssel erkannt wird.
Im Moment schreibe ich das Array in einen String um und speichere diesen dann als Schlüssel, damit funktioniert es. Ich will aber auf die zeitaufwendige Umwandlung verzichten.

Hat jemand einen Tip? Das ganze sollte leider mit Java 1.4 funktionieren....

Kurzfassung meines Problems: ich habe Integer-Arrays denen eine Zahl zugeordnet ist, und will möglichst schnell die zugeordnete Zahl für ein Array abfragen können.

Grüsse, Chris
 

Wildcard

Top Contributor
Wieso denn als String? Ein Array ist ein Objekt, also kannst du's als Key nehmen.
Die Frage ist eher was du als Value übergibst, denn in Java 1.4 kann man eben nicht einfach so primitive Datentypen in eine Map packen.
 

schmiddy123

Mitglied
Aber wenn ich folgendes mache:

Code:
int[] x = {1,1,1};

hashmap.put(x, 15);

int[] y = {1,1,1};

hashmap.get(y);

dann kriege ich null zurück, ich denke weil für ihn y noch nicht in der Hashmap enthalten ist.... Es scheint also doch nicht direkt mit Arrays als Key zu gehen?? Oder kriege ich null weil er mit dem int als value nicht umgehen kann??
 

Wildcard

Top Contributor
Erstens würde das unter JAva 1.4 gar nicht kompilieren, und zweitens sind x und y unterschiedliche Objekt.
y ist ein komplett neues Array das zufällig die gleichen Werte hat.
 

schmiddy123

Mitglied
Genau! Das ist gerade mein Problem!

x und y sind unterschiedliche Arrays, die aber die gleichen Werte haben. Und wegen den gleichen Werten ist ihnen auch die gleiche Zahl zugewiesen. Deshalb will ich sie in der Hashmap speichern und wenn ich ein Array krieg, das ich schonmal hatte, will ich die zugeordnete Zahl nicht neu berechnen sondern einfach aus der hashmap herauslesen.

Und jetzt suche ich eben nach einem Weg das effizient (und wenns geht ohne Strings) zu machen.
 
S

SlaterB

Gast
die Aufgabe ist aus einem vorhandenen Objekt einen Key zu bestimmen,

wie soll Java deiner Meinung nach vorgehen?
die einzelnen Zahlen addieren? deren Hashcodes addieren?
die Reihenfolge beachten oder nicht?
da gibts keinen einfachen Weg,

manche wollen für zwei Arrays gleichen Inhalts nur dann den gleichen Key wenn es wirklich dasselbe Objekt ist,
du möchtest den gleichen Key, wenn der Inhalt der gleiche ist,

abgesehen von obigen Problemen muss man sich hier zwischen zwei fundamentalen Varianten entscheiden und da ist die, die der unterschiedlichen Keys für jedes Array die einfachere

leider ist ein Array ein besonderer Typ in Jave, so dass du (glaube ich) auch nicht die hashcode()-Operation überschreiben kannst,

da bleiben dir nur drei Möglichkeiten:
1.
von Anfang an auf Arrays verzichen, z.B. ArrayList stattdessen,
2.
vor der Suche in einer Hashmap den Key selber berechen/ ändern,
z.B. indem du einen String daraus machst oder irgendein anderes Objekt, dass du stattdessen als Key verwendest
(alternativ: einen Integer berechnen mit Hilfe einer Hashfunktion, siehe erst mal google falls dir das nichts sagt)
3.
die Hashmap überschreiben, so dass dort der Key anders berechnet wird (z.B. wie bei 2. mit einer eigenen Hashfunktion)

aus einer bestimmten Sichtweise sind 1, und 2. und 3. das gleiche, nur dass der Ort der Logik ein wenig verlagert wird,

das Grundprinzip ist nun mal
Objekt, Key, Map,

bisher benutzt du ein Standardobjekt Array mit einem Standardkey hashcode (mit Standardinhalt irgendwas) und eine Standardmap die auf diesen Standardkey des Standardobjekts zugreift

je nachdem was du machst kannst du manche Schritte verändern,

den Inhalt das Standardkey hashcode ersetzen geht beim Array nicht, bei ArrayList sehr wohl (1.),

den Zugriff der Standardmap auf das Standardobjekt Array ersetzt du durch ein eigenes Objekt in 2.

bleibts bei Standardobjekt Array, dann kannst du mit einer eigenen Map (3.) den nciht zu ändernen Standardkey einfach ignorieren und dir einen anderen Key zusammenbauen (z.B. Array-Elemente anschauen)

klingt verwirrend, ist aber interessant ;)
 

Wildcard

Top Contributor
Mal anders gefragt:
Was willst du, im größeren Kontext, denn überhaupt machen?
Vieleicht gibt's da eine bessere Möglichkeit.
 

sayang

Aktives Mitglied
Num mal so in den Raum geworfen. Was ist wenn du ein eigenes Objekt erzeugst, in dem sowohl dein int[] als auch deine zahl gespeichert ist... z. B. so

Code:
public class IntArrayMitZahl {
  private int[] intArray;
  private int zahl;

  public IntArrayMitZahl(int[] a) {
    intArray = a;
    berechneZahl();
  }

  public IntArrayMitZahl(int[] a, int z) {
    intArray = a;
    zahl = z;
  }

  private berechneZahl() {
    zahl = ... //... hier aus dem Array die Zahl berechnen
  }

  public int[] getIntArray() {
    return intArray;
  }

  public void setIntArray(int[] a) {
    intArray = a;
  }

  public int getZahl() {
    return zahl;
  }

  public void setZahl(int z) {
    zahl = z;
  }
}

Lg
sayang
 

schmiddy123

Mitglied
Erstmal Danke für die Antworten:

@SlaterB: Das hat mir schonmal einiges weitergeholfen! Ich habe bisher noch nie genau darpber nachgedacht, wie bei der HM die keys eigentlich behandelt werden. Vielleicht schreibe ich wirklich eine Funktion, die aus dem Array-Inhalt einenKey erstellt, der verwendet werden kann. mal schauen wie das am schnellsten geht.

@wildcard: worum es genau geht, ist sehr lang zu erklären. ich durchlaufe aber eine lange Berechnung, bei der die int-arrays eine bestimmte genetische Struktur beschreiben. zu dieser Struktur berechne ich einen Wert, eben diesen den ich speichern will, was sehr aufwendig ist, weshalb ich es für jede Struktur nur einmal machen will. Die verschiedenen Strukturen können nämlich mehrmals vorkommen und da wäre es ineffizient bei einer bereits aufgetretenen diesen Wert erneut zu berechnen.

@sayang: Danke, aber mir geht es weniger darum die Zahl zum Array zu speichern, sondern schnell die Zahl zu einem Array irgendwo rauszuholen. ich glaube auf diese Weise bringt es mir leider nicht so viel. Ich denke auch nicht, dass so ein Objekt von der Hashmap direkt als key verwendet werden könnte, selbst wenn, ich kann das Objekt nicht erstellen ohne die Zahl und die will ich ja rausholen und nicht berechnen.....

Falls es noch weitere Vorschläge gibt, nur her damit!! ;-)
 
S

SlaterB

Gast
> Ich denke auch nicht, dass so ein Objekt von der Hashmap direkt
> als key verwendet werden könnte,
> selbst wenn, ich kann das Objekt nicht erstellen ohne die Zahl und
>die will ich ja rausholen und nicht berechnen.....

das ginge schon, das ist in etwa das gleiche wie den String zusammenzubauen (Möglichkeit 2),
du musst nun nur noch die hashcode-Operation des eigenen Datentyps überschreiben
und dort den charakteristischen Key zurückgeben, der wahrscheinlich nicht nur die Summe, sondern auch die Reihenfolge berücksichtigen muss,

das ganze macht in einer Verbindung mit der Hashmap natürlich nur Sinn,
wenn diese Berechnung deulich schneller ist als die Berechnung der eigentlich gesuchten Zahl,

aber eins muss dir klar sein: du brauchst irgendwas, was von jedem einzelnen Element des Arrays abhängt,

auch bei einem String ist es nicht einfacher, da muss die Hashfunktion genauso jeden Buchstaben einzeln anschauen und bei der Berechnung miteinbeziehen,

eine Ein-Schritt-Lösung ist von der Logik her unmöglich,

--------

das schnellstmögliche wäre wohl die Speicherung aller Zielwerte in einem riesigen Array,
so dass die Inhalte jedes Einzelarrays als Pfad darin genutzt werden können

int[] array = new int[3][3][3][3][3][3][3][3];


key = [0,1,1,0,2,0,0,1] -> array[key[0]][key[1]]... = array[0][1][1][0][2][0][0][1];

auch hier muss jedes Element einzeln gelesen und benutzt werden


------------

das gleiche etwas sparsamer:
int[] array = new int[3^8];

int index = key[0]*3^0 +key[1]*3^1+key[2]*3^2+..
// gleichzeitig auch eine mögliche Hashfunktion für eine Hashmap!

int zahl = array[index]

klappt natürlich nur in sehr engen Grenzen, auch mit long ;)
 

sayang

Aktives Mitglied
schmiddy123 hat gesagt.:
@sayang: Danke, aber mir geht es weniger darum die Zahl zum Array zu speichern, sondern schnell die Zahl zu einem Array irgendwo rauszuholen. ich glaube auf diese Weise bringt es mir leider nicht so viel. Ich denke auch nicht, dass so ein Objekt von der Hashmap direkt als key verwendet werden könnte, selbst wenn, ich kann das Objekt nicht erstellen ohne die Zahl und die will ich ja rausholen und nicht berechnen.....

Aber du könntest doch die Zahl aus diesem Objekt (siehe meinen Post weiter oben) als Key benutzen... oder check ich hier etwas nicht so ganz :?

Code:
IntArrayMitZahl foo = new IntArrayMitZahl(deinIntArray[]);
hashmap.put(foo.put(new Integer(foo.getZahl()), foo);

Lg
sayang
 

schmiddy123

Mitglied
@nureingast: dein vorschlag ist sehr gut!! Das funktioniert und ist schonmal einiges schneller als meine alte Version! Was mich wundert, mit mehrdimensionalen Arrays scheint die Hashfunktion nicht klarzukommen. Da gibt es bei zwei mehrdimensionalen Arrays mit gleichem Inhalt zwei verschiedene Hashwerte. Weiß jemand woran es liegt? Aber man kann es ja notfalls in eindimensionale umschreiben.

@sayang: wenn ich die Zahl aus dem Objekt als Key verwende, kann ich ja nur rausfinden welches Array zu welcher Zahl gehört, ich will aber die Zahl zum Array rausholen, da die Zahl sehr aufwendig zu berechnen ist.
 

Wildcard

Top Contributor
schmiddy123 hat gesagt.:
@nureingast: dein vorschlag ist sehr gut!! Das funktioniert und ist schonmal einiges schneller als meine alte Version! Was mich wundert, mit mehrdimensionalen Arrays scheint die Hashfunktion nicht klarzukommen. Da gibt es bei zwei mehrdimensionalen Arrays mit gleichem Inhalt zwei verschiedene Hashwerte. Weiß jemand woran es liegt? Aber man kann es ja notfalls in eindimensionale umschreiben.
Wie dir die API verraten hätte, liegt das daran, das diese Methode hashCode auf jedem Element des Arrays aufruft.
Daher hast du das gleiche Problem wieder
 
N

NurEinGast

Gast
schmiddy123 hat gesagt.:
Was mich wundert, mit mehrdimensionalen Arrays scheint die Hashfunktion nicht klarzukommen. Da gibt es bei zwei mehrdimensionalen Arrays mit gleichem Inhalt zwei verschiedene Hashwerte.
Bisher ging ich davon aus, dass es nur um eindimensionale Arrays geht. Bei Mehrdinemsionalen könntest Du mal deepHashCode(Object[] a) aus der Arrays-Klasse versuchen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Frage regex greater than less than Allgemeine Java-Themen 7
berserkerdq2 Frage zu IntelliJ und JavaFX Allgemeine Java-Themen 1
W Timer Konzept-Frage Allgemeine Java-Themen 16
T Eine Frage des Designs Allgemeine Java-Themen 2
C Frage zu eigenem TableCellRenderer Allgemeine Java-Themen 11
C Programmvorstellung & Frage zum Thema Geschäftsform Allgemeine Java-Themen 51
J Frage zu System.getproperties. Allgemeine Java-Themen 60
molat100 wie kann man die Frage beantworten Allgemeine Java-Themen 1
pkm Frage zur Präzision von Calendar.WEEK_OF_YEAR Allgemeine Java-Themen 12
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
F Frage zu System.in Allgemeine Java-Themen 3
marcooooo Frage zum Beispiel im Anhang Allgemeine Java-Themen 16
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
B For-Loop Frage Allgemeine Java-Themen 21
L Java frage Allgemeine Java-Themen 3
bueseb84 Frage zu Mock und UpperBound Allgemeine Java-Themen 2
M Frage zum Konstruktor Allgemeine Java-Themen 2
W Best Practice Frage zur Umsetzung MVC Allgemeine Java-Themen 9
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
B Frage zu Unit-Tests Allgemeine Java-Themen 6
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
R Allgemeine Frage zu RMI bei MVC Allgemeine Java-Themen 2
O Frage zum Runtimeverhalten von Java ... Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
D Frage zu Vererbung Allgemeine Java-Themen 5
J Frage zu regulärem Ausdruck Allgemeine Java-Themen 2
M Allgemeine Frage: Wie lernt man Java / Programmieren von Grund auf? Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Frage zur JLS Allgemeine Java-Themen 0
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
A Methoden Allgemeine Java Frage Allgemeine Java-Themen 3
E String Frage Allgemeine Java-Themen 9
I bin neu bei GitHub, Frage zur Sicherheit Allgemeine Java-Themen 14
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
C KeyListener Frage Allgemeine Java-Themen 3
T Frage zu UML in Java programmieren Allgemeine Java-Themen 1
R Konstanten initialisieren - FRAGE Allgemeine Java-Themen 3
MTJ004 FTP Frage zu FTP Speicherung Java-Android-FTP Allgemeine Java-Themen 5
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
A Frage zu meinem Code Allgemeine Java-Themen 2
RalleYTN Classpath Nur ne kleine Frage zur MANIFEST.MF Allgemeine Java-Themen 4
T Frage zu Access Modifiers Allgemeine Java-Themen 6
W Input/Output Frage zu pdfbox und FileUtils Allgemeine Java-Themen 2
O Frage zur Implementierungsweise Allgemeine Java-Themen 4
B Frage zu Bitshift Allgemeine Java-Themen 3
J Java Zufallsgenerator (6 aus 49) Frage Allgemeine Java-Themen 7
L Frage zu RIA und GWT Allgemeine Java-Themen 0
P Concurrency Frage Allgemeine Java-Themen 8
M Frage zu Enumerations Allgemeine Java-Themen 2
F Unlimited Strength Policy. Frage Verbreitung der Anwendung Allgemeine Java-Themen 1
F Frage zur Library JTS Allgemeine Java-Themen 5
S Java Design Frage Allgemeine Java-Themen 10
E Reflection? Frage Allgemeine Java-Themen 4
C FileInputStream frage Allgemeine Java-Themen 6
G Polymorphie Programmdesign Frage Allgemeine Java-Themen 20
Uzi21 Frage zu NetBeans ( Console) Allgemeine Java-Themen 11
D Classpath Frage zum Java Resource Loading Allgemeine Java-Themen 2
G Frage zu JPA Allgemeine Java-Themen 1
S Methoden Frage Allgemeine Java-Themen 2
P MVC - Frage zu Model Allgemeine Java-Themen 4
K Frage zu Locks Allgemeine Java-Themen 1
S Frage zu abstract Allgemeine Java-Themen 5
M ArrayList<String> Frage Allgemeine Java-Themen 7
M OOP Design Frage Allgemeine Java-Themen 2
N Frage zur while-Schleife Allgemeine Java-Themen 18
T Best Practice Auslesen von Zeichenketten (Frage, Antworten, usw) Allgemeine Java-Themen 4
C Eine Frage zur Bearbeitungszeit Allgemeine Java-Themen 8
H Frage wegen Heap-Speicher Allgemeine Java-Themen 2
T Garbage Collection Frage Allgemeine Java-Themen 15
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
D Frage zu Java und Umlauten / charsets Allgemeine Java-Themen 2
B Frage zu Java und OpenGL? Allgemeine Java-Themen 3
Q Kapselung Allgemeine Design- Frage Allgemeine Java-Themen 8
A eine test thread.join() frage Allgemeine Java-Themen 2
DStrohma LayoutManager Frage zum GridBagLayout Allgemeine Java-Themen 4
F Frage zu Regex möglich Allgemeine Java-Themen 4
H XML-File mit Java erzeugt Frage Allgemeine Java-Themen 10
D Frage und Antwort Programm, Problem bei Methodenaufruf Allgemeine Java-Themen 3
J NetBeans Frage bezüglich der Scanner-Klasse Allgemeine Java-Themen 6
H Java Vector Frage Allgemeine Java-Themen 9
W Frage... Allgemeine Java-Themen 29
R Frage zur topologischen Sortierung Allgemeine Java-Themen 2
H Frage zu weka.core.Instance Allgemeine Java-Themen 3
Y Kleine Frage zu String.split Allgemeine Java-Themen 3
T Frage zu Klassendesing Allgemeine Java-Themen 3
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
C Eclipse Wichtige frage Allgemeine Java-Themen 5
H Frage zu java.weka.core.Instances Allgemeine Java-Themen 3
S Frage zu Format Modifiers in Log4j Allgemeine Java-Themen 11
H Frage zu clone() Allgemeine Java-Themen 5
4 Simple(?) Frage zu Threads Allgemeine Java-Themen 14
H2SO3- SCJP Chapter 3 Frage 10. Falsche Antwort? Allgemeine Java-Themen 15
H Frage sinnvolle Datenspeicherung und -verarbeitung Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben