Java: HashMap StartsWith?


26.06.2020, 16:22

Beispiel:Ich habe in meine HashMap 2 Keys eingefügt. Hallo, und Welt. Ich möchte mit einem IF Befehl überprüfen ob mein String mit einem Key der Map startet.

Set<String> keys = KeyWords.keySet();
if(mystring.startsWith(keys)){
  //....
}

So wie hier(siehe Quellcode) geht das ja nicht.

6 Antworten

Das hört sich danach an, dass dein Key nicht korrekt normalisiert ist. Irgendetwas in dem String dient als Schlüssel und sollte von dem anderen Teil separiert werden.

Meine Empfehlung: den Anteil der Zeichenkette, den du für Identifikation des Eintrags in der HashMap nutzen möchtest von dem Teil trennen, der für die Identifikation nicht notwendig ist. Der Teil, der nicht notwendig ist für die Identifikation wird dann Teil des Values.

Egal, ob mit Streams oder händisch per Schleifen: Wenn das am Ende auch performant laufen soll, wirst du nicht um eine eigens dafür entwickelte Datenstruktur herum kommen.

Ich würde eine TreeMap mit einer HashMap kombinieren, die eigene leichtgewichtige Wrapperobjekte halten, und zzgl. noch einen Bloomfilter mit einem TreeSet realisieren.

Das wird dann auch performant laufen, wenn du mehr als einige Tausend Wörter abspeicherst, ohne dass dir der Speicher wegläuft.

Google mal danach, wie man Such- oder Wortvorschläge in Java realisiert, wie z. B. bei einer Googlesuche oder in einer IDE. Das wird zu 100% dein Problem erschlagen, und du wirst sehen, dass du mit nur einer einzigen herkömmlichen Datenstruktur nicht weit iommen wirst.

Viel Spaß! :)

Woher ich das weiß:Berufserfahrung
oopexpert  26.06.2020, 05:35

Eine Treemap in Java ist eine semantisch defekte Datenstruktur und sollte vermieden werden.

3
mintkissen  26.06.2020, 09:22
@oopexpert

Ich kann jetzt ehrlich gesagt mit deiner Aussage nicht viel anfangen, erahne aber, dass sich dahinter etwas Interessantes mit wahrem Kern verbirgt.

Könntest du deine Andeutungen deshalb bitte etwas ausführlicher beschreiben, oder einen Link posten?

Vielen Dank im Voraus!

0
mintkissen  27.06.2020, 08:12
@oopexpert

An welcher Stelle genau verstößt eine TreeMap dagegn? Hast du ein Beispiel?

0
oopexpert  27.06.2020, 09:29
@mintkissen

TreeMap benötigt Objekte, die Comparable implementieren. TreeMap sichert aber zu eine Map zu sein (implementiert Map).

Die TreeMap erfüllt aber nicht die Eigenschaften einer Map. Man kann TreeMap nicht beliebig dort verwenden, wo man eine Map verwendet, weil die zu haltenden Objekte einer Einschränkung unterliegen: Sie müssen Comparable sein. Nach Liskov darf man Unterklassen "erweitern" aber nicht "einschränken". Unterklassen dürfen Verhalten spezifizieren, aber nicht umdefinieren.

Das Liskovsche Substitutionsprinzip besagt einfach: "Kompromittiere deine Abstraktion nicht!". Und genau das tut die TreeMap.

Sagen wir mal so: Man kann TreeMap verwenden. Man sollte sie aber wrappen, sodass man keine Map-Schnittstelle exposed.Damit würde man das Problem isolieren und auf auf eine Klasse beschränken.

An der Stelle hat JAVA halt Mist gebaut.

0

Am einfachsten geht es mit Streams

Map<String, Integer> map = new HashMap<>();
String search = "test123123";
map.put("test123", 1);
map.put("test", 2);
map.put("123test", 3);
map.keySet().stream().filter(search::startsWith).forEach(System.out::println);

Mit der keySet Methode ein Set von Keys ausgeben lassen, und über diese Iterieren und sie mit deinem String vergleichen.

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf