Les entretiens techniques comportent souvent des questions qui testent votre compréhension des collections, en particulier des HashMaps. Un défi courant consiste à compter les occurrences d'éléments dans une liste. Cette question aide les enquêteurs à évaluer votre capacité à gérer efficacement l'agrégation des données et à éviter les pièges comme NullPointerException.
Si vous êtes nouveau sur HashMaps, vous souhaiterez peut-être consulter mon Cracking the Basics of HashMap : Key Concepts for Java Developers pour obtenir des connaissances de base avant de vous plonger dans cet article.
Dans cet article, nous allons :
Vous recevez une liste d'entiers et votre tâche consiste à renvoyer chaque nombre unique ainsi que le nombre de ses occurrences dans la liste. Il s'agit d'un problème typique qui teste votre compréhension de la structure de données HashMap et votre capacité à la mettre en œuvre efficacement.
Voici un exemple :
[1, 2, 3, 5, 2, 1]
{1=2, 2=2, 3=1, 5=1}
Si la liste d'entrée est nulle ou vide, le résultat doit renvoyer un HashMap vide.
Dans cette solution, nous vérifions manuellement si le HashMap contient déjà le numéro comme clé. Si c'est le cas, nous incrémentons la valeur ; si ce n'est pas le cas, nous insérons la clé avec une valeur de 1.
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; public class CountNumbers { private HashMapgetCount(List list) { // Initialize HashMap to store number counts HashMap map = new HashMap(); // To avoid NullPointerException in case of a null list if (list != null) { // Iterate through each number in the list for (int num : list) { // If first occurrence, add number with count 1 if (!map.containsKey(num)) { map.put(num, 1); } else { // If the number already exists, increment its count by 1 map.put(num, map.get(num) 1); } } } return map; } public static void main(String[] args) { // Using ArrayList Parameterized Constructor with Collection as argument List numbers = new ArrayList(Arrays.asList(1, 2, 3, 5, 2, 1)); CountNumbers nums = new CountNumbers(); System.out.println(nums.getCount(null)); // Result -> {} System.out.println(nums.getCount(numbers)); // Result -> {1=2, 2=2, 3=1, 5=1} } }
Complexité temporelle :
Complexité spatiale : O(n) – Dans le pire des cas, tous les nombres sont uniques et stockés dans le HashMap.
La classe Java HashMap fournit une manière plus propre et plus concise de gérer ce problème avec la méthode getOrDefault(). Il élimine le besoin d'une logique if-else en renvoyant une valeur par défaut si la clé n'est pas trouvée dans la carte.
V getOrDefault(Object key, V defaultValue)
Paramètres :
Returns : la valeur à laquelle la clé spécifiée est mappée, ou defaultValue si la carte ne contient aucun mappage pour la clé.
Pour plus d'informations, vous pouvez consulter le Javadoc officiel pour HashMap.
import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; public class CountNumbers { private HashMapgetCount(List list) { // Initialize HashMap to store number counts HashMap map = new HashMap(); // To avoid NullPointerException in case of a null list if (list != null) { // Iterate through each number in the list for (int num : list) { // Cleaner solution using getOrDefault() map.put(num, map.getOrDefault(num, 0) 1); } } return map; } public static void main(String[] args) { // Using ArrayList Parameterized Constructor with Collection as argument List numbers = new ArrayList(Arrays.asList(1, 2, 3, 5, 2, 1)); CountNumbers nums = new CountNumbers(); System.out.println(nums.getCount(null)); // Result -> {} System.out.println(nums.getCount(numbers)); // Result -> {1=2, 2=2, 3=1, 5=1} } }
Aspect | Approche traditionnelle | Utilisation de getOrDefault() |
---|---|---|
Lisibilité du code | Légèrement verbeux avec une logique if-else | Plus propre et plus concis |
Performance | Idem (O(n)) | Idem (O(n)) |
Cas d'utilisation | Fonctionne pour toutes les versions de Java | Nécessite Java 8 ou version ultérieure |
Les deux solutions donneront le même résultat, mais l'utilisation de getOrDefault() rend le code plus concis et lisible. Cette question est une question courante lors des entretiens, car elle évalue votre compréhension de HashMaps, de l'itération et de la gestion des valeurs nulles. Il est également étroitement lié aux problèmes liés au comptage de fréquence et à l'agrégation de données.
Si vous avez trouvé cet article utile, assurez-vous de consulter également les autres articles de la série Collections Framework Essentials !
Principes de base de Java
Les essentiels de l'entretien de tableau
L'essentiel de la mémoire Java
Bon codage !
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3