"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > HashMaps في العمل: معالجة تحدي مقابلة جافا المشتركة

HashMaps في العمل: معالجة تحدي مقابلة جافا المشتركة

تم النشر بتاريخ 2024-11-07
تصفح:105

HashMaps in Action: Tackling a Common Java Interview Challenge

غالبًا ما تشتمل المقابلات الفنية على أسئلة تختبر فهمك لمجموعات ، وخاصة HashMaps. أحد التحديات الشائعة يتضمن حساب تكرارات العناصر داخل القائمة . يساعد هذا السؤال القائمين على المقابلات على تقييم قدرتك على التعامل مع تجميع البيانات بكفاءة وتجنب المخاطر مثل NullPointerException .

إذا كنت جديدًا في HashMaps، فقد ترغب في الاطلاع على Cracking the Basics of HashMap: المفاهيم الأساسية لمطوري Java للحصول على المعرفة الأساسية قبل الغوص في هذا المنشور.

في هذه التدوينة سنقوم بما يلي:

  • استكشف بيان المشكلة بالتفصيل.
  • حلها بطريقتين: الحل التقليدي إذا كان آخر وطريقة getOrDefault().
  • مناقشة تعقيد الزمان والمكان لكلا التطبيقين.
  • مقارنةبين كلا الحلين، بما في ذلك وقت استخدام كل منهما.

بيان المشكلة

يتم إعطاؤك قائمة بالأعداد الصحيحة، ومهمتك هي

إرجاع كل رقم فريد مع عدد مرات ظهوره في القائمة. هذه مشكلة نموذجية تختبر فهمك لبنية بيانات HashMap وقدرتك على تنفيذها بكفاءة. إليك مثال:

مدخل

: [1, 2, 3, 5, 2, 1]

الإخراج

: {1=2، 2=2، 3=1، 5=1}

{1=2, 2=2, 3=1, 5=1}
فارغة أو فارغة

، فيجب أن تُرجع النتيجة HashMap فارغة.


الحل 1: النهج التقليدي باستخدام if-else

في هذا الحل، نقوم

بالتحقق يدويًا مما إذا كانت HashMap تحتوي بالفعل على الرقم

كمفتاح. إذا حدث ذلك، فإننا نزيد القيمة؛ إذا لم يحدث ذلك، نقوم بإدخال المفتاح بقيمة 1.

شفرة

استيراد java.util.ArrayList; استيراد java.util.Arrays؛ import java.util.HashMap; import java.util.List; عدد أرقام الفئة العامة { خاص HashMap getCount(List list) { // تهيئة HashMap لتخزين أعداد الأرقام HashMap Map = new HashMap(); // لتجنب NullPointerException في حالة وجود قائمة فارغة إذا (قائمة != فارغة) { // التكرار من خلال كل رقم في القائمة لـ (عدد العمليات: القائمة) { // في حالة التواجد الأول، أضف رقمًا بالعدد 1 إذا (!map.containsKey(num)) { Map.put(num, 1); } else { // إذا كان الرقم موجودًا بالفعل، فقم بزيادة عدده بمقدار 1 Map.put(num, Map.get(num) 1); } } } خريطة العودة؛ } public static void main(String[] args) { // استخدام مُنشئ ArrayList ذو المعلمات مع المجموعة كوسيطة List number = new ArrayList(Arrays.asList(1, 2, 3, 5, 2, 1)); CountNumbers nums = new CountNumbers(); System.out.println(nums.getCount(null)); // النتيجة -> {} System.out.println(nums.getCount(numbers)); // النتيجة -> {1=2، 2=2، 3=1، 5=1} } }

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class CountNumbers {

    private HashMap getCount(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}
    }
}

توضيح

    إذا كانت القائمة فارغة
  1. : نحن نتجنب NullPointerException عن طريق التحقق مما إذا كانت القائمة فارغة قبل التكرار.
  2. التكرار على القائمة
  3. : لكل رقم، إذا كان موجودًا بالفعل في HashMap، فإننا نزيد قيمته. وإلا فإننا ندرجها بقيمة 1.
تعقيد الزمان والمكان

  • تعقيد الوقت

    :

      O(n)
    • - نجتاز القائمة مرة واحدة، حيث n هو عدد العناصر. تستغرق كل عملية HashMap (وضع والحصول)
    • O(1)
    • في المتوسط، مما يجعل التعقيد الزمني الإجمالي O(n).
  • تعقيد الفضاء

    : O(n) – في أسوأ الحالات، جميع الأرقام فريدة ومخزنة في HashMap.

الحل 2: النهج الأمثل باستخدام طريقة getOrDefault()

توفر فئة Java HashMap

طريقة أكثر نظافة وإيجازًا

للتعامل مع هذه المشكلة باستخدام طريقة getOrDefault(). إنه يلغي الحاجة إلى منطق if-else عن طريق إرجاع القيمة الافتراضية إذا لم يتم العثور على المفتاح في الخريطة.

تعريف الطريقة

V getOrDefault(مفتاح الكائن، V defaultValue)

V getOrDefault(Object key, V defaultValue)
  • حدود

    :

    المفتاح: المفتاح الذي سيتم إرجاع قيمته المرتبطة به.
    • defaultValue: القيمة التي سيتم إرجاعها إذا كانت الخريطة لا تحتوي على تعيين للمفتاح.
  • إرجاع

    : القيمة التي تم تعيين المفتاح المحدد لها، أو القيمة الافتراضية إذا كانت الخريطة لا تحتوي على تعيين للمفتاح.

  • لمزيد من المعلومات، يمكنك مراجعة Javadoc الرسمي لـ HashMap.

شفرة

استيراد java.util.ArrayList; استيراد java.util.Arrays؛ import java.util.HashMap; import java.util.List; عدد أرقام الفئة العامة { خاص HashMap getCount(List list) { // تهيئة HashMap لتخزين أعداد الأرقام HashMap Map = new HashMap(); // لتجنب NullPointerException في حالة وجود قائمة فارغة إذا (قائمة != فارغة) { // التكرار من خلال كل رقم في القائمة لـ (عدد العمليات: القائمة) { // الحل الأنظف باستخدام getOrDefault() Map.put(num, Map.getOrDefault(num, 0) 1); } } خريطة العودة؛ } public static void main(String[] args) { // استخدام مُنشئ ArrayList ذو المعلمات مع المجموعة كوسيطة List number = new ArrayList(Arrays.asList(1, 2, 3, 5, 2, 1)); CountNumbers nums = new CountNumbers(); System.out.println(nums.getCount(null)); // النتيجة -> {} System.out.println(nums.getCount(numbers)); // النتيجة -> {1=2، 2=2، 3=1، 5=1} } }

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

public class CountNumbers {

    private HashMap getCount(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}
    }
}

توضيح

    استخدام getOrDefault()
  1. : تقوم هذه الطريقة بإرجاع قيمة المفتاح إذا كانت موجودة. إذا لم يكن الأمر كذلك، فسيتم إرجاع القيمة الافتراضية المقدمة (في هذه الحالة، 0).
  2. الإدراج والزيادة
  3. : يضيف الكود مباشرة 1 إلى القيمة الافتراضية، مما يلغي الحاجة إلى منطق if-else.
مزايا getOrDefault()

    رمز المنظف
  • : يقلل من النمطية عن طريق إزالة الحاجة إلى if-else.
  • نفس التعقيد
  • : O(n) لكل من الزمان والمكان.

مقارنة كلا النهجين

وجهالمنهج التقليدياستخدام getOrDefault() سهولة قراءة الكود أداءحالة الاستخدام
مطول قليلاً مع منطق if-else أنظف وأكثر إيجازًا
نفسه (O(n)) نفسه (O(n))
يعمل لجميع إصدارات جافا يتطلب Java 8 أو أعلى

خاتمة

سيؤدي كلا الحلين إلى نفس النتيجة، ولكن

استخدام getOrDefault()

يجعل الكود أكثر إيجازًا وقابلية للقراءة. يعد هذا السؤال من الأسئلة الشائعة في المقابلة الشخصية لأنه يقيم فهمك لـ HashMaps والتكرار والتعامل مع القيم الخالية. كما أنها ترتبط ارتباطًا وثيقًا بالمشكلات التي تتضمن عد التكرار وتجميع البيانات. إذا وجدت هذا المنشور مفيدًا، فتأكد من مراجعة المنشورات الأخرى في سلسلة أساسيات إطار عمل المجموعات أيضًا!

المشاركات ذات الصلة

    أساسيات جافا
  • أساسيات مقابلة المصفوفة
  • أساسيات ذاكرة جافا
  • تعليمات سعيدة!

بيان الافراج يتم استنساخ هذه المقالة على: https://dev.to/arshisaxena26/hashmaps-in-action-tackling-a-common-java-interview-challenge-2757؟1 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3