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

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

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

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]刪除
最新教學 更多>
  • 了解命令式程式設計和聲明式程式設計之間的區別
    了解命令式程式設計和聲明式程式設計之間的區別
    當我剛開始學習React時,我的老師說:「JavaScript是命令式編程,而React是聲明式編程。」然而,一開始這對我來說不太有意義。因此,我決定將其分解以更好地理解其中的差異。 將命令式和聲明式程式設計與披薩進行比較? 為了更容易理解,讓我們來比較一下這兩種烹飪方法。 ...
    程式設計 發佈於2024-11-08
  • 如何在JavaScript中進行穩定排序以保持元素順序的一致性?
    如何在JavaScript中進行穩定排序以保持元素順序的一致性?
    JavaScript 中的穩定排序演算法對資料進行排序時,保留相等元素的原始順序對於穩定的排序演算法至關重要。在這種情況下,我們的目標是按給定順序對具有特定鍵的物件陣列進行排序,同時保持元素順序一致性。 穩定排序技術有趣的是,甚至非穩定排序函數可以實現穩定排序。透過在排序前捕捉每個元素的初始位置,我...
    程式設計 發佈於2024-11-08
  • npm 與 npx
    npm 與 npx
    如果您一直在使用 Node.js,您可能遇到過 npm 和 npx。 雖然它們聽起來很相似且都是 Node.js 生態系統不可或缺的一部分,但它們有不同的用途。這篇文章將探討 npm 和 npx 之間的差異,幫助您了解何時以及為何使用它們。 什麼是NPM? NPM 是 Node...
    程式設計 發佈於2024-11-08
  • Python 中的鍊式賦值如何運作?它們真的相當於多個順序分配嗎?
    Python 中的鍊式賦值如何運作?它們真的相當於多個順序分配嗎?
    理解Python 中的鍊式賦值Python 中的鍊式賦值,例如「x = y = somefunction()」這樣的表達式,引發了人們的關注關於它們與多個順序賦值的等價性的討論(“x = somefunction(); y = somefunction()”)。為了澄清這個問題,讓我們詳細探討一下鍊...
    程式設計 發佈於2024-11-08
  • 如何使用 Gorilla Websocket 在 Go Websocket 應用程式中向特定用戶端發送目標訊息?
    如何使用 Gorilla Websocket 在 Go Websocket 應用程式中向特定用戶端發送目標訊息?
    Go with Gorilla Websocket 中的特定客戶端訊息傳遞在websocket 通訊領域,向特定客戶端發送訊息的能力對於建立即時應用程式至關重要。然而,預設的 websocket 範例通常會示範同時向所有連線的用戶端廣播訊息。 為了解決這個問題,我們可以採用一種方法,為每個客戶端分配...
    程式設計 發佈於2024-11-08
  • O - 開閉原理 (OCP)
    O - 開閉原理 (OCP)
    What is Open/Closed Principle(OCP)? According to the Open/Closed Principle, "Objects or entities (such as classes, modules, functions, etc.) ...
    程式設計 發佈於2024-11-08
  • C 的力量:創造一個為世界提供動力的系統
    C 的力量:創造一個為世界提供動力的系統
    C 是一種強大的程式語言,因其高效、可移植和低階控製而聞名。它廣泛用於開發關鍵任務系統,如作業系統、嵌入式系統和資料結構。其特點包括:高效率:C 程式碼直接編譯為機器碼,實現更高執行效率。可移植:C 可以跨多種平台運行,方便在各種裝置上部署應用程式。低階訪問:C 提供對硬體和記憶體的低階訪問,允許精...
    程式設計 發佈於2024-11-08
  • Google Sheets 到 MySQL 只需幾分鐘
    Google Sheets 到 MySQL 只需幾分鐘
    Google Sheets 数据导入 MySQL:初学者指南 您是否希望将 Google Sheets 数据转换为 MySQL 数据库?如果是这样,那么您来对地方了!在这个适合初学者的教程中,我们将引导您完成将 Google Sheets 数据导入 MySQL 数据库的过程。 如果您没有编码背景,请...
    程式設計 發佈於2024-11-08
  • 如何在 MySQL 中將紀元數字轉換為人類可讀的日期?
    如何在 MySQL 中將紀元數字轉換為人類可讀的日期?
    在 MySQL 中將紀元數轉換為人類可讀的日期在資料庫管理領域,經常需要將紀元數轉換為人類可讀的日期。紀元編號表示自訂紀元以來的某個時間點,通常用於在 MySQL 等資料庫系統中儲存時態資料。 假設您有一個紀元編號,例如 1389422614485,它代表一個特定的時間點。該值的資料類型是varch...
    程式設計 發佈於2024-11-08
  • 介紹 simpledev.css
    介紹 simpledev.css
    simpledev.css 是一個新的 CSS 框架,我將其描述為大多數無類別框架。我稱之為無類,因為許多程式碼使用類型選擇器,因此您不必添加許多類別來設定網頁樣式。有一些類,但我們盡量將它們保持在最低限度(到目前為止只有大約 42 個類)。 讓我們回顧一下下面的一些功能! 特徵...
    程式設計 發佈於2024-11-08
  • 掌握影像分割:傳統技術如何在數位時代仍然大放異彩
    掌握影像分割:傳統技術如何在數位時代仍然大放異彩
    介绍 图像分割是计算机视觉中最基本的过程之一,它允许系统分解和分析图像内的各个区域。无论您是在处理对象识别、医学成像还是自动驾驶,分割都可以将图像分解为有意义的部分。 尽管深度学习模型在这项任务中越来越受欢迎,但数字图像处理中的传统技术仍然强大且实用。本文回顾的方法包括阈值处理、边...
    程式設計 發佈於2024-11-08
  • 系統整合測試:確保無縫軟體集成
    系統整合測試:確保無縫軟體集成
    在軟體開發的動態環境中,確保系統的各個組件或模組無縫地協同工作對於提供可靠且高效能的軟體解決方案至關重要。這篇部落格文章深入探討了系統整合測試 (SIT),這是軟體測試生命週期中的關鍵階段,用於驗證整合組件之間的交互,確保系統的整體功能和可靠性。 什麼是系統整合測試? 系統整合測試 (SIT) ...
    程式設計 發佈於2024-11-08
  • 掌握 Angular Table 中可調整大小的欄位:開發人員逐步指南
    掌握 Angular Table 中可調整大小的欄位:開發人員逐步指南
    如何在 Angular 表中创建可调整大小的列:分步指南 Angular Material 表提供了一种时尚的数据显示方式。然而,用户通常需要额外的功能,例如调整表列大小以更好地控制数据显示的能力。在本指南中,我们将逐步介绍使用自定义指令在 Angular 表中创建可调整大小的列的...
    程式設計 發佈於2024-11-08
  • 如何依子值升序對多維 PHP 陣列進行排序?
    如何依子值升序對多維 PHP 陣列進行排序?
    PHP:以子值對多維數組進行排序此問題旨在根據「mid」子值對多維 PHP 數組進行排序。為了實現這一點,響應者建議使用 usort 函數,它允許基於比較的排序。 代碼如下:function cmp($a, $b) { return $a["mid"] - $b[...
    程式設計 發佈於2024-11-08
  • 如何在 Django 中創建一個簡單的調度程序
    如何在 Django 中創建一個簡單的調度程序
    如果您需要每X 分鐘/秒等運行一個函數來進行一些清理,觸發一些操作,您可以在線程模組和django 自訂cli 的幫助下執行一個簡單的調度程序命令。 假設我想每 5 秒呼叫一個函數以在外部 API 上發布一些內容。 在您的 django 應用程式中建立一個名為 management 的資料夾/包...
    程式設計 發佈於2024-11-08

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

Copyright© 2022 湘ICP备2022001581号-3