# Höchsten int-Wert(key) aus einer Hashmap suchen



## HakBak (8. Jun 2009)

Hallo, 
ich stehe gerade etwas auf dem Schlauch und habe zudem noch nicht viel mit Hashmaps gearbeitet. Wie kann ich denn aus einer Hashmap den höchsten Wert ausgeben. Das soll heißen, den höchsten Schlüssel, der als int gespeichert wird? Ist das irgendwie mögliche?


----------



## bygones (8. Jun 2009)

```
new TreeSet(theMap).iterator().next()
```


----------



## heart_disease (8. Jun 2009)

Mich würde mal interessieren wozu du das überhaupt brauchst! Ich hoffe ich habe deine Anforderung richtig verstanden:

```
import java.util.HashMap;
import java.util.Iterator;

public class HashMapTest {
	public static void main( String[] args ) {
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		map.put( 2, "value1" );
		map.put( 1, "value2" );
		map.put( 5, "value3" );
		map.put( 3, "value4" );
		
		System.out.println( getHighestKey( map ) );
	}
	
	public static int getHighestKey( HashMap<Integer, String> map ) {
		Iterator<Integer> i = map.keySet().iterator();
		
		int value = 0;
		int tmp;
		while ( i.hasNext() ) {
			tmp = i.next();
			
			if ( tmp > value ) {
				value = tmp;
			}
		}
		
		return value;
	}
}
```


----------



## HakBak (8. Jun 2009)

Hi, ja vielen Dank, du hast meine Gedankengänge genau erfasst, was ich genau damit bezwecken will, muss ich mir jetzt selbst nochmal überlegen, sollte ich auf eine Lösung kommen, werde ich natürlich gleich posten


----------



## Verjigorm (8. Jun 2009)

Seit Java 1.5 sollte man den Iterator nichtmehr verwenden.
Lieber EntrySet!


```
for (Map.Entry entry : map.entrySet()) {
            entry.getKey();
            entry.getValue();
        }
```

Und bitte gegen Interfaces programmieren


----------



## bygones (8. Jun 2009)

Verjigorm hat gesagt.:


> Seit Java 1.5 sollte man den Iterator nichtmehr verwenden.


abgesehen davon dass mein schnell dahin gehauhenes falsch ist... wer sagt dass man einen Iterator nicht mehr verwenden soll ??? in der API is nix von deprecated beim Iterator


----------



## maki (8. Jun 2009)

Über das entrySet zu iterieren ist dann sinnvoll, wenn man sowohl die keys als auch values braucht, den so wird ein (überflüssiger) Lockup pro Iteration vermieden.

Hier werden m.E. aber nur die keys genutzt, oder?


----------



## Landei (8. Jun 2009)

Also wäre es

```
new TreeSet(theMap.keySet()).iterator().next()
```


----------



## Marco13 (8. Jun 2009)

Was dann - wenn ich mich gerade nicht täusche - erstmal den NIEDRIGSTEN Wert liefert....


----------



## Landei (8. Jun 2009)

ups, dann muss man noch einen "Umdreh"-Comparator mit reinpacken


----------



## Marco13 (8. Jun 2009)

Oder einfach von vorne nach hinten durch die Keys laufen, und sich den höchsten merken - es muss ja nicht immer ein Einzeiler sein, wenn ein dreizeiler 100x schneller ist


----------



## heart_disease (9. Jun 2009)

Hier nochmal die angepasste Version:

```
import java.util.Date;
import java.util.HashMap;
import java.util.Map.Entry;

public class HashMapTest {
	public static void main( String[] args ) {
		HashMap<Integer, String> map = new HashMap<Integer, String>();
		for ( int i=0; i < 1000; i++ ) {
			map.put( i, "value"+i );
		}
		
		long before = new Date().getTime();
		System.out.println( getHighestKey( map ) );
		long after = new Date().getTime();
		
		System.out.println( after-before + " ms" );
	}
	
	public static int getHighestKey( HashMap<Integer, String> map ) {
		int value = 0;
		for ( Entry<Integer, String> entry : map.entrySet() ) {
            if ( entry.getKey() > value ) {
            	value = entry.getKey();
            }
        }
		
		return value;
	}
}
```

Bezüglich Performance: Bei mir am Laptop braucht getHighestKey() genau 2 Millisekunden (bei 1000 Einträgen).


----------



## Marco13 (9. Jun 2009)

So genau kann man das so einfach nicht messen. Lass' es 10 mal laufen, und du wirst sicher Abweichungen von mindestens 100% zu dem gemessenen Wert bekommen...


----------



## SchonWiederFred (9. Jun 2009)

HakBak hat gesagt.:


> Wie kann ich denn aus einer Hashmap den höchsten Wert ausgeben. Das soll heißen, den höchsten Schlüssel, der als int gespeichert wird?




```
public static int largest_int(Map<Integer, ?> map)
{
	return Collections.max(map.keySet());
}
```


----------



## Marco13 (9. Jun 2009)

Also DOCH 'n Einzeiler


----------



## heart_disease (10. Jun 2009)

> So genau kann man das so einfach nicht messen. Lass' es 10 mal laufen, und du wirst sicher Abweichungen von mindestens 100% zu dem gemessenen Wert bekommen...


Das weiß ich schon, 2 ms ist trotzdem ziemlich genau der Durchschnittswert.

Die largest_int-Methode von SchonWiederFred ist ziemlich genau so schnell.


----------



## bygones (10. Jun 2009)

heart_disease hat gesagt.:


> Die largest_int-Methode von SchonWiederFred ist ziemlich genau so schnell.


und nun rate mal welche besser lesbar ist ?

geschwindigkeit ist bei ueber 90% aller Projekte nebensaechlich


----------



## Meru (11. Jun 2009)

Also ich persönlich würde daraus eien TreeMap machen, weil diese autromatisch nach dem Key sortiert, sprich, der höchste steht ganz am Ende. Und den letzten (sowie auch den ersten) Index kann man, ohne iterieren zu müssen, einfach abfragen


```
TreeMap<Integer, String> map = new TreeMap<Integer, String>();
map.put(1, "eins");
map.put(5, "fuenf");
map.put(6, "sechs");
map.put(7, "sieben");
map.put(2, "zwei");
		
System.out.println(map.lastEntry().getValue());
System.out.println(map.lastEntry().getKey());

// Console: sieben
// Console: 7
```


----------



## Marco13 (11. Jun 2009)

Ähnlich wie Landei schon gesagt hatte. Das Erstellen einer TreeMap benötigt aber O(nlogn), und das einfache Durchlaufen nur O(n). OK, meistens egal, aber es gibt ja auch Prinzipien


----------



## Ark (11. Jun 2009)

Mich würde viel eher interessieren, wie überhaupt die Elemente in die Map gelangt sind, denn möglicherweise hätte man schon beim Eintragen in die Map das größte Element rausfischen können.

Ark


----------

