HashMap nach kleinstem Value durchsuchen

f4814n

Mitglied
Hallo,

ich brauche mal wieder eure Hilfe.

Die Aufgabe lautet wie folgt:

Ich habe eine Hashmap<Character, Integer> in der Buchstaben gespeichert sind und die Anzhal wie oft sie in einem Wort vorkommen.

ich soll die HashMap durchlaufen und den seltensten bzw. zweitseltensten Buchstaben in einem char Array speichern.

mit :

Java:
public char[] getRareChars() {
	
		
		for(Map.Entry<Character, Integer> e : counter.entrySet()){ //counter -name der hm                          
			
			char c = e.getKey();
			int i = e.getValue();
			 
			// und jetzt?
	
		}
		
		return new char[]{0,0};
	}

ich bin etwas überfragt. Freu mich auf Feedback! DANKE
 
H

hüteüberhüte

Gast
Aus der Map eine Liste machen, diese dann sortieren, und die dotierte Liste dann ins Array übertragen
 

f4814n

Mitglied
was ist der Unterschied zur ArrayList?

Kann ich darin nicht nur Objekte speichern?

kann ich da die chars mit entsprechendem Integer reinspeichern und dann NUR nach dem Integer sortieren??

DANKE!!
 
N

nillehammer

Gast
Problem 1: Die Map garantiert die Reihenfolge (wenn überhaupt) nur für die Keys. Die Reihenfolge der Values ist daher garantiert nicht so, wie wir sie haben wollen. Wir müssen also irgendwie durch die Map durchiterieren und dabei einfach und intelligent umsortieren. Wir bräuchten was, das die Sortierung nach dem Value des Entriys macht. Lösung: wir basteln uns einen
Code:
Comparator
dafür.

Als Container für die neu sortierten Entries nehmen wir ein
Code:
TreeSet
, dem wir unseren
Code:
Comparator
übergeben. Damit werden die Entries in diesem Set nun nach ihrem Value sortiert. Das ist die schnellste Sortiervariante. Collections.sort für Listen ist langsamer. Obwohl sich das wohl erst bei sehr vielen Elementen bemerkbar machen dürfte. Und das ist ja bei dem begrenzten Wertebereich von char ausgeschlossen. Egal, so werden die Entries jedenfalls gleich beim add sortiert und wir sparen uns den Aufruf von Collections.sort.

Problem 2: Der return type ist ein Array von primitiven chars. D.h. die Methoden des Collections-Frameworks, die Arrays erzeugen, bringen uns nichts, weil diese nie primitive Elemente enthalten können. Wir müssen also selbst Unboxen undas Array befüllen.

Nachfolgender Code macht das alles. Kopieren, compilieren, ausführen:
Java:
public class MapEntriesToCharArray {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		final Map<Character, Integer> charsToUseCount = new HashMap<>(3);

		charsToUseCount.put('a', 2);
		charsToUseCount.put('e', 8);
		charsToUseCount.put('f', 4);

		final char[] sortedByUseCount = getRareChars(charsToUseCount);
		System.out.println(Arrays.toString(sortedByUseCount));
	}

	public static char[] getRareChars(final Map<Character, Integer> charMap) {

		final Set<Map.Entry<Character, Integer>> valueSortedEntries = new TreeSet<>(
				MapEntryComparator.ASCENDING_VALUES);
		valueSortedEntries.addAll(charMap.entrySet());

		final char[] result = new char[valueSortedEntries.size()];

		int currentResultIndex = 0;
		for (final Map.Entry<Character, Integer> entry : valueSortedEntries) {

			result[currentResultIndex] = entry.getKey();
			currentResultIndex++;
		}

		return result;
	}

	private static enum MapEntryComparator implements
			Comparator<Map.Entry<Character, Integer>> {
		/**
		 * Diese Implementierung sortiert Map.Entries nach dem Wert ihres values
		 * (hier ein Integer).
		 */
		ASCENDING_VALUES;

		@Override
		public final int compare(final Entry<Character, Integer> first,
				final Entry<Character, Integer> second) {
			return first.getValue().compareTo(second.getValue());
		}
	}

}
 
Zuletzt bearbeitet von einem Moderator:

DrZoidberg

Top Contributor
Das geht aber auch einfacher.
Java:
public char[] getRareChars() {
    char[] result = new char[2];
    int[] count = {Integer.MAX_VALUE, Integer.MAX_VALUE};
    for(Map.Entry<Character, Integer> e : counter.entrySet()){                       
        char c = e.getKey();
        int i = e.getValue();
        if(i < count[1]) {
          count[0] = count[1];
          result[0] = result[1];
          count[1] = i;
          result[1] = c;
        }
    }
    return result;
}
 
N

nillehammer

Gast
DrZoidberg hat gesagt.:
Das geht aber auch einfacher. [...]
Wenn ich die Anforderung richtig verstanden habe, ging es darum, die Characters sortiert nach ihrer Anwendungshäufigkeit in einem char-Array auszugeben. Das ist zumindest das, was mein Code macht.
Den Zweck Deines Codes habe ich noch nicht ganz durchschaut...
 

Marco13

Top Contributor
Der Code macht (soweit ich das überflogen habe) das, was im Eröffnungsbeitrag gefordert wurde - und zwar ohne Schnörkel.
[ot]
Als ich den Threadttitel gelesen habe, habe ich mich schon darauf "gefreut", wieder irgendwas zu lesen mit ~"in einem Array kopieren und sortieren" - nur um den Krampf zu sehen, den sich der Antwortende dann dafür antun würde
[/ot]
Vermutlich ist die Problembeschreibung zu ungenau. Geht wes wirklich IMMER NUR genau (!) um den seltensten und den zweitseltensten? Dann tut's das von DrZoidberg. Wenn es um eine nach Häufigkeit sortierte Map geht, könnte sowas wie http://www.java-forum.org/codeschnipsel-u-projekte/64510-map-treemap-sorted-values.html hilfreich sein.
 
N

nillehammer

Gast
Marco13 hat gesagt.:
, was im Eröffnungsbeitrag gefordert wurde
Den ich gerade noch mal gelesen habe... bei nur zwei chars im Array ist meine Lösung Overkill und erfüllt die Anfroderung auch nicht, da sie einen char-Array mit allen Elementen ausgibt. Die zwei seltenst verwendeten stehen zwar an index 0,1, aber der Array ist zu lang für die Anforderung... dann wohl doch das von DrZoidberg.

Ich merke, dass spät nachts meine Aufnahmefähigkeit wohl doch etwas nachlässt...
 

f4814n

Mitglied
ich bin eben erst nach hause kommen und kann mich jetzt erst dem ganzen widmen. Vielen Dank für das Feedback und dass ihr euch so kümmert. Das ist dfür jemanden wie mich super hilfreich!!!

Ich kann das glaube ich am ehesten auflösen indem ich mal die Aufgaben beschreibung poste, wollte euch den Text eigentlich gerne ersparen ;-)

Aufgabe 2 hier:

http://web.informatik.uni-mannheim.de/java10000/pi2/pi2-2012-pklausur-2nd.pdf

ich hab übrigens auch ein Thread zu Aufgabe 3 ;-) vielleicht kann mir da der eine oder andere vielleicht weiterhelfen. Die dortigen Helfer haben sich glaube ich verabschiedet nachdem ich etwas Verwirrung gestiftet habe hahaha

Thread zu Aufgabe 3:

http://www.java-forum.org/java-basi...7281-aufgabe-arrays-arraylist.html#post985499

Beste Grüße und tausend DANK!
 

f4814n

Mitglied
Problem 1: Die Map garantiert die Reihenfolge (wenn überhaupt) nur für die Keys. Die Reihenfolge der Values ist daher garantiert nicht so, wie wir sie haben wollen. Wir müssen also irgendwie durch die Map durchiterieren und dabei einfach und intelligent umsortieren. Wir bräuchten was, das die Sortierung nach dem Value des Entriys macht. Lösung: wir basteln uns einen
Code:
Comparator
dafür.

Als Container für die neu sortierten Entries nehmen wir ein
Code:
TreeSet
, dem wir unseren
Code:
Comparator
übergeben. Damit werden die Entries in diesem Set nun nach ihrem Value sortiert. Das ist die schnellste Sortiervariante. Collections.sort für Listen ist langsamer. Obwohl sich das wohl erst bei sehr vielen Elementen bemerkbar machen dürfte. Und das ist ja bei dem begrenzten Wertebereich von char ausgeschlossen. Egal, so werden die Entries jedenfalls gleich beim add sortiert und wir sparen uns den Aufruf von Collections.sort.

Problem 2: Der return type ist ein Array von primitiven chars. D.h. die Methoden des Collections-Frameworks, die Arrays erzeugen, bringen uns nichts, weil diese nie primitive Elemente enthalten können. Wir müssen also selbst Unboxen undas Array befüllen.

Nachfolgender Code macht das alles. Kopieren, compilieren, ausführen:
Java:
public class MapEntriesToCharArray {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		final Map<Character, Integer> charsToUseCount = new HashMap<>(3);

		charsToUseCount.put('a', 2);
		charsToUseCount.put('e', 8);
		charsToUseCount.put('f', 4);

		final char[] sortedByUseCount = getRareChars(charsToUseCount);
		System.out.println(Arrays.toString(sortedByUseCount));
	}

	public static char[] getRareChars(final Map<Character, Integer> charMap) {

		final Set<Map.Entry<Character, Integer>> valueSortedEntries = new TreeSet<>(
				MapEntryComparator.ASCENDING_VALUES);
		valueSortedEntries.addAll(charMap.entrySet());

		final char[] result = new char[valueSortedEntries.size()];

		int currentResultIndex = 0;
		for (final Map.Entry<Character, Integer> entry : valueSortedEntries) {

			result[currentResultIndex] = entry.getKey();
			currentResultIndex++;
		}

		return result;
	}

	private static enum MapEntryComparator implements
			Comparator<Map.Entry<Character, Integer>> {
		/**
		 * Diese Implementierung sortiert Map.Entries nach dem Wert ihres values
		 * (hier ein Integer).
		 */
		ASCENDING_VALUES;

		@Override
		public final int compare(final Entry<Character, Integer> first,
				final Entry<Character, Integer> second) {
			return first.getValue().compareTo(second.getValue());
		}
	}

}

Danke für die Mühe, die Aufgabe gibt jedoch vor eine HashMap verwenden zu müssen. Scheint aber mit einer Treemap tatsächlich besser zu funktionieren soweit ich das beurteilen kann...
 

f4814n

Mitglied
Java:
public class CharCounterXTest {

	private CharCounterX counterx;
	
	@Before
	public void init(){ 
		this.counterx = new CharCounterXImpl();
	}

	@Test
	public void testSimple1() {
		String text = "aaaa bbb cc d";
		this.counterx.parse(text);
		char[] cc = this.counterx.getRareChars();
		char c1 = cc[0];
		char c2 = cc[1];
		assertEquals('d', c1);
		assertEquals('c', c2);
	}

	
	@Test
	public void testSimple2() {
		String text = "abcdefg abcdefg abcdefg xx abcdefg yyy abcdefg abcdefg abcdefg abcdefg";
		this.counterx.parse(text);
		char[] cc = this.counterx.getRareChars();
		char c1 = cc[0];
		char c2 = cc[1];
		assertEquals('x', c1);
		assertEquals('y', c2);
	}
	
	@Test
	public void testNotEnough1() {
		String text = "";
		this.counterx.parse(text);
		char[] cc = this.counterx.getRareChars();
		assertNull(cc);
	}
	
	@Test
	public void testNotEnough2() {
		String text = "a";
		this.counterx.parse(text);
		char[] cc = this.counterx.getRareChars();
		assertNull(cc);
	}
	
	@Test
	public void testNotEnough3() {
		String text = "qqqqqqqqqqqqqqqqqqqqqqqqqq";
		this.counterx.parse(text);
		char[] cc = this.counterx.getRareChars();
		assertNull(cc);
	}


Das sind übrigens die ersten paar Tests zu der Aufgabe und mit der Lösung wird leider keiner grün...
 

DrZoidberg

Top Contributor
Die Methode soll also null zurückliefern, wenn weniger als 2 verschiedene Buchstaben im Text vorkommen?
Dann must du den Code doch nur etwas ergänzen.
Java:
public char[] getRareChars() {
    if(counter.size() < 2) return null;
    char[] result = new char[2];
    int[] count = {Integer.MAX_VALUE, Integer.MAX_VALUE};
    for(Map.Entry<Character, Integer> e : counter.entrySet()){                       
        char c = e.getKey();
        int i = e.getValue();
        if(i < count[0]) {
            count[1] = count[0];
            result[1] = result[0];
            count[0] = i;
            result[0] = c;
        } else if(i < count[1]) {
            count[1] = i;
            result[1] = c;
        }
    }
    return result;
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
D Map (HashMap) sortiern nach den Value? Java Basics - Anfänger-Themen 16
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
krgewb HashMap Java Basics - Anfänger-Themen 2
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
berserkerdq2 Hashmap, wie prüfe ich ob ein Key schon existiert Java Basics - Anfänger-Themen 19
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
F gson mit einer Hashmap Java Basics - Anfänger-Themen 2
J JSON-HashMap Java Basics - Anfänger-Themen 3
J Hashmap Java Basics - Anfänger-Themen 13
C Hashmap zickt Java Basics - Anfänger-Themen 9
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
J HashMap Java Basics - Anfänger-Themen 6
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
O HashMap - ArrayList Java Basics - Anfänger-Themen 29
J Hashmap langsamer als compareTo? Java Basics - Anfänger-Themen 23
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
N Methoden HashMap interne Werte miteinander vergleichen Java Basics - Anfänger-Themen 7
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
J Hashmap auslesen Java Basics - Anfänger-Themen 7
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
shiroX Methoden Morse-Code Übersetzer mit HashMap Java Basics - Anfänger-Themen 5
E HashMap Problem Java Basics - Anfänger-Themen 5
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T HashMap und die Methoden Java Basics - Anfänger-Themen 13
N Methoden Interaktives PDF mit HashMap befüllen Java Basics - Anfänger-Themen 0
Z Hashmap auseinandernehmen und analysieren Java Basics - Anfänger-Themen 7
B Durchlaufen von Hashmap und Arraylist Java Basics - Anfänger-Themen 8
F HashMap oder welches Array? Java Basics - Anfänger-Themen 4
T HashMap Java Basics - Anfänger-Themen 24
L Hashmap mit variablem Key Java Basics - Anfänger-Themen 9
M Collections Probleme mit Hashmap Java Basics - Anfänger-Themen 4
N Collections String in HashMap umwandeln Java Basics - Anfänger-Themen 3
Z HashMap richtig benutzen Java Basics - Anfänger-Themen 2
lgund HashMap // TS3 Query Java Basics - Anfänger-Themen 7
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
E Hashmap Wert auslesen Java Basics - Anfänger-Themen 2
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
dat_vin OOP Hashmap und Attribute Java Basics - Anfänger-Themen 7
C Check ob eine HashMap schon existiert Java Basics - Anfänger-Themen 16
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
R Hashmap in anderer Klasse nicht benutzbar Java Basics - Anfänger-Themen 1
T Java Hashmap Java Basics - Anfänger-Themen 3
L Gibt es etwas wie "HashMap <String, String, String> Java Basics - Anfänger-Themen 9
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
S OOP Klasse mit static-Eigenschaften - HashMap füllen Java Basics - Anfänger-Themen 6
O HashMap Fragen Java Basics - Anfänger-Themen 8
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
M Semantisches Problem HashMap/Netzwerk Java Basics - Anfänger-Themen 4
D HashMap Keys durchlaufen Java Basics - Anfänger-Themen 2
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
M HashMap keys ausgeben Java Basics - Anfänger-Themen 2
S In einer Hashmap Klassen regestrieren Java Basics - Anfänger-Themen 2
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
G HashMap Java Basics - Anfänger-Themen 6
F Wortpaare - HashMap - ArrayList Java Basics - Anfänger-Themen 6
M HashMap Frage Java Basics - Anfänger-Themen 3
M HashMap - put() reagiert nicht? Java Basics - Anfänger-Themen 8
N Cast eines Objektes in eine Hashmap Java Basics - Anfänger-Themen 13
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
F Hilfe bei der HashMap. Java Basics - Anfänger-Themen 3
F HashMap vs. TreeMap Java Basics - Anfänger-Themen 5
B HashMap Java Basics - Anfänger-Themen 9
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
V Hashmap Iterieren Java Basics - Anfänger-Themen 4
C Csv File in Hashmap ausgeben Java Basics - Anfänger-Themen 14
T HashMap<String,Object> Werte auslesen Java Basics - Anfänger-Themen 5
I HashMap sortieren Java Basics - Anfänger-Themen 10
I HashMap Java Basics - Anfänger-Themen 11
H Collections Brauche modifizierte HashMap Java Basics - Anfänger-Themen 6
H TreeMap/HashMap synchronisieren Java Basics - Anfänger-Themen 2
A Datentypen Hashmap to Array Java Basics - Anfänger-Themen 11
D HashMap überschreibt Werte Java Basics - Anfänger-Themen 7
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
D erweiterte hashmap Java Basics - Anfänger-Themen 5
H HashMap<Int, String> - Er findet die Int-Klasse nicht. Java Basics - Anfänger-Themen 3
L HashMap zu JList Java Basics - Anfänger-Themen 6
S Erste Schritte HashMap Kurze Frage - Werte über Schleife ausgeben Java Basics - Anfänger-Themen 30
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
B Klassen HashMap Zwei Objekte, gleicher Key Java Basics - Anfänger-Themen 4
N HashMap fehlerhafte Rückgabe Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben