」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > HashMap 實際應用:應對常見的 Java 面試挑戰

HashMap 實際應用:應對常見的 Java 面試挑戰

發佈於2024-11-07
瀏覽:451

HashMaps in Action: Tackling a Common Java Interview Challenge

技术面试通常会提出一些问题来测试您对集合的理解,尤其是HashMaps。一个常见的挑战涉及计算列表中元素的出现次数。这个问题可以帮助面试官评估您有效处理数据聚合并避免NullPointerException等陷阱的能力。

如果您是 HashMap 新手,在深入研究本文之前,您可能需要查看我的破解 HashMap 基础知识:Java 开发人员的关键概念 了解基础知识。

在这篇文章中,我们将:

  • 详细探索问题陈述
  • 用两种方法解决它:传统的 if-else 解决方案getOrDefault()方法
  • 讨论两种实现的时间和空间复杂度
  • 两种解决方案的比较,包括何时使用每种解决方案。

问题陈述

您将获得一个整数列表,您的任务是返回每个唯一数字及其在列表中出现的次数。这是一个典型的问题,考验你对HashMap数据结构的理解以及高效实现它的能力。

这是一个例子:

输入

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

输出

{1=2, 2=2, 3=1, 5=1}

如果输入列表为空或空,结果应返回一个空的HashMap


解决方案 1:使用 if-else 的传统方法

在此解决方案中,我们手动检查HashMap是否已包含数字作为键。如果是,我们增加该值;如果没有,我们插入值为 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. 迭代列表:对于每个数字,如果它已经存在于 HashMap 中,我们就递增它的值。否则,我们插入值为 1.

时间和空间复杂性

  • 时间复杂度

    • O(n) – 我们遍历列表一次,其中 n 是元素的数量。
    • 每个 HashMap 操作(put 和 get)平均需要 O(1),使得整体时间复杂度 O(n).
  • 空间复杂度O(n) – 在最坏的情况下,所有数字都是唯一的并存储在 HashMap 中。


解决方案 2:使用 getOrDefault() 方法的优化方法

Java HashMap 类提供了更干净、更简洁的方式用 getOrDefault() 方法来处理这个问题。如果在映射中找不到键,它会通过返回 默认值 来消除对 if-else 逻辑的需要。

方法定义

V getOrDefault(Object key, V defaultValue)
  • 参数

    • key: 要返回关联值的键。
    • defaultValue:如果映射不包含键的映射则返回的值。
  • 返回:指定键映射到的值,如果映射不包含该键的映射,则返回 defaultValue。

更多信息可以查看HashMap官方Javadoc。

代码

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) {
                // 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}
    }
}

解释

  1. 使用 getOrDefault():此方法返回键的值(如果存在)。如果不是,则返回提供的默认值(在本例中为0)。
  2. 插入和自增:代码直接在默认值上加1,省去了if-else逻辑。

getOrDefault() 的优点

  • 更简洁的代码:通过消除 if-else 的需要来减少样板文件。
  • 相同的复杂度O(n)时间和空间

两种方法的比较

if-else 逻辑稍显冗长更干净、更简洁相同 (O(n))相同 (O(n))适用于所有 Java 版本需要 Java 8 或更高版本
方面 传统方法 使用 getOrDefault()
代码可读性
表现
用例

结论

两种解决方案都会产生相同的结果,但是

使用 getOrDefault() 使代码更加简洁和可读。这个问题是面试中常见的问题,因为它评估您对 HashMap、迭代和处理空值 的理解。它还与涉及频率计数数据聚合的问题密切相关。

如果您发现这篇文章有帮助,请务必查看 Collections Framework Essentials 系列中的其他文章!


相关帖子

  • Java 基础知识

  • Array面试要点

  • Java 内存基础知识

快乐编码!

版本聲明 本文轉載於:https://dev.to/arshisaxena26/hashmaps-in-action-tackling-a-common-java-interview-challenge-2757?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何使用“ JSON”軟件包解析JSON陣列?
    如何使用“ JSON”軟件包解析JSON陣列?
    parsing JSON與JSON軟件包 QUALDALS:考慮以下go代碼:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    程式設計 發佈於2025-05-22
  • Go語言如何動態發現導出包類型?
    Go語言如何動態發現導出包類型?
    與反射軟件包中的有限類型的發現能力相反,本文探索了替代方法,探索了在Runruntime。 go import( “ FMT” “去/進口商” ) func main(){ pkg,err:= incorter.default()。導入(“ time”) 如果er...
    程式設計 發佈於2025-05-22
  • 在C#中如何高效重複字符串字符用於縮進?
    在C#中如何高效重複字符串字符用於縮進?
    在基於項目的深度下固定字符串時,重複一個字符串以進行凹痕,很方便有效地有一種有效的方法來返回字符串重複指定的次數的字符串。使用指定的次數。 constructor 這將返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.W...
    程式設計 發佈於2025-05-22
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的Python功能Eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。 This article delves into the differences betwee...
    程式設計 發佈於2025-05-22
  • 用戶本地時間格式及時區偏移顯示指南
    用戶本地時間格式及時區偏移顯示指南
    在用戶的語言環境格式中顯示日期/時間,並使用時間偏移在向最終用戶展示日期和時間時,以其localzone and格式顯示它們至關重要。這確保了不同地理位置的清晰度和無縫用戶體驗。以下是使用JavaScript實現此目的的方法。 方法:推薦方法是處理客戶端的Javascript中的日期/時間格式化和...
    程式設計 發佈於2025-05-22
  • 如何在Chrome中居中選擇框文本?
    如何在Chrome中居中選擇框文本?
    選擇框的文本對齊:局部chrome-inly-ly-ly-lyly solument 您可能希望將文本中心集中在選擇框中,以獲取優化的原因或提高可訪問性。但是,在CSS中的選擇元素中手動添加一個文本 - 對屬性可能無法正常工作。 初始嘗試 state)</option> < o...
    程式設計 發佈於2025-05-22
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-05-22
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-05-22
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-05-22
  • 為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    為什麼PHP的DateTime :: Modify('+1個月')會產生意外的結果?
    使用php dateTime修改月份:發現預期的行為在使用PHP的DateTime類時,添加或減去幾個月可能並不總是會產生預期的結果。正如文檔所警告的那樣,“當心”這些操作的“不像看起來那樣直觀。 考慮文檔中給出的示例:這是內部發生的事情: 現在在3月3日添加另一個月,因為2月在2001年只有2...
    程式設計 發佈於2025-05-22
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,輸出...
    程式設計 發佈於2025-05-22
  • 使用jQuery如何有效修改":after"偽元素的CSS屬性?
    使用jQuery如何有效修改":after"偽元素的CSS屬性?
    在jquery中了解偽元素的限制:訪問“ selector 嘗試修改“:”選擇器的CSS屬性時,您可能會遇到困難。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    程式設計 發佈於2025-05-22
  • 在Python中如何創建動態變量?
    在Python中如何創建動態變量?
    在Python 中,動態創建變量的功能可以是一種強大的工具,尤其是在使用複雜的數據結構或算法時,Dynamic Variable Creation的動態變量創建。 Python提供了幾種創造性的方法來實現這一目標。 利用dictionaries 一種有效的方法是利用字典。字典允許您動態創建密鑰並...
    程式設計 發佈於2025-05-22
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-05-22
  • Python環境變量的訪問與管理方法
    Python環境變量的訪問與管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    程式設計 發佈於2025-05-22

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3