Je voudrais trouver le plus grand nombre dans HashSet et HashMap. Disons que j'ai le numéro [22,6763,32,42,33] dans mon HashSet et que je veux trouver le plus grand nombre dans mon HashSet actuel .. comment pourrais-je le faire? Et même chose pour le HashMap aussi. J'espère que vous pourrez m'aider avec ça. Je vous remercie.
Vous pouvez utiliser Collections.max(Collection)
pour rechercher l'élément maximal dans n'importe quelle collection . De même, pour une HashMap
, vous pouvez utiliser la même méthode sur sa keySet()
ou values()
, selon que vous voulez clé maximale ou valeur maximale.
En outre, si vous le souhaitez, vous pouvez utiliser à la place les variables TreeSet
et TreeMap
, qui stockent les éléments dans un ordre de clé trié.
essayer
int max = Collections.max(set);
int maxKey = Collections.max(map.keySet());
int maxValue Collections.max(map.values());
Si vous êtes obligé d'utiliser une variable HashSet
/HashMap
, vous devez alors analyser la variable HashSet
/HashMap
entière afin de trouver le maximum. Les fonctions de bibliothèque telles que Collections.max()
feront comme ceci.
Si vous souhaitez que O(1)
récupère le maximum et que vous soyez autorisé à modifier le type de collection en cours d'utilisation, utilisez un ensemble/une carte triés (par exemple, TreeSet
/TreeMap
).
Quelque chose comme ça:
Set<Integer> values = new HashSet<Integer>() {{
add(22);
add(6763);
add(32);
add(42);
add(33);
}};
int maxValue = Integer.MIN_VALUE;
for (int value : values) {
if (value > maxValue) {
maxValue = value;
}
}
Et ça:
Map<String, Integer> values = new HashMap<String, Integer>() {{
put("0", 22);
put("1", 6763);
put("2", 32);
put("3", 42);
put("4", 33);
}};
int maxValue = Integer.MIN_VALUE;
for (int value : values.values()) {
if (value > maxValue) {
maxValue = value;
}
}
Dans le cas de TreeMap, si vous savez que la clé/les valeurs sont insérées de manière aléatoire, l’arbre sera plus ou moins équilibré. Les arbres sont déséquilibrés. Si les données sont insérées dans un ordre déjà trié, la capacité de trouver rapidement (ou d'insérer ou de supprimer) un élément donné est perdue. En cas d’arbre déséquilibré, cela prendra du temps proportionnel à n, O(n) sinon O (1).
Voici une méthode simple qui fait ce que vous demandez:
public String getMapKeyWithHighestValue(HashMap<String, Integer> map) {
String keyWithHighestVal = "";
// getting the maximum value in the Hashmap
int maxValueInMap = (Collections.max(map.values()));
//iterate through the map to get the key that corresponds to the maximum value in the Hashmap
for (Map.Entry<String, Integer> entry : map.entrySet()) { // Iterate through hashmap
if (entry.getValue() == maxValueInMap) {
keyWithHighestVal = entry.getKey(); // this is the key which has the max value
}
}
return keyWithHighestVal;
}
Pensez à utiliser Apache Commons Math . Voici la documentation API .
La classe d'intérêt est SummaryStatistics . Cela fonctionne avec double
s et calcule max, min, moyenne, etc. à la volée (au fur et à mesure que vous lui ajoutez des valeurs). Les valeurs de données n'étant pas stockées en mémoire, cette classe peut être utilisée pour calculer des statistiques pour des flux de données très volumineux.
Note : Si vous voulez trouver la plus grande valeur de Map, essayez maxEntry.get (). GetValue () au lieu de maxEntry.get (). GetKey ()
1. Utilisation de Stream
public <K, V extends Comparable<V>> V maxUsingStreamAndLambda(Map<K, V> map) {
Optional<Entry<K, V>> maxEntry = map.entrySet()
.stream()
.max((Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
.compareTo(e2.getValue())
);
return maxEntry.get().getKey();
}
2. Utilisation de Collections.max () avec une expression Lambda
public <K, V extends Comparable<V>> V maxUsingCollectionsMaxAndLambda(Map<K, V> map) {
Entry<K, V> maxEntry = Collections.max(map.entrySet(), (Entry<K, V> e1, Entry<K, V> e2) -> e1.getValue()
.compareTo(e2.getValue()));
return maxEntry.getKey();
}
3. Utilisation de Stream avec Method Reference
public <K, V extends Comparable<V>> V maxUsingStreamAndMethodReference(Map<K, V> map) {
Optional<Entry<K, V>> maxEntry = map.entrySet()
.stream()
.max(Comparator.comparing(Map.Entry::getValue));
return maxEntry.get()
.getKey();
}
4. Utilisation de Collections.max ()
public <K, V extends Comparable<V>> V maxUsingCollectionsMax(Map<K, V> map) {
Entry<K, V> maxEntry = Collections.max(map.entrySet(), new Comparator<Entry<K, V>>() {
public int compare(Entry<K, V> e1, Entry<K, V> e2) {
return e1.getValue()
.compareTo(e2.getValue());
}
});
return maxEntry.getKey();
}
5. Utilisation d'une simple itération
public <K, V extends Comparable<V>> V maxUsingIteration(Map<K, V> map) {
Map.Entry<K, V> maxEntry = null;
for (Map.Entry<K, V> entry : map.entrySet()) {
if (maxEntry == null || entry.getValue()
.compareTo(maxEntry.getValue()) > 0) {
maxEntry = entry;
}
}
return maxEntry.getKey();
}