「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > HashMap の実際の動作: Java 面接の一般的な課題への取り組み

HashMap の実際の動作: Java 面接の一般的な課題への取り組み

2024 年 11 月 7 日に公開
ブラウズ:141

HashMaps in Action: Tackling a Common Java Interview Challenge

技術面接では、コレクション、特に HashMaps についての理解をテストする質問が頻繁に行われます。よくある課題の 1 つは、リスト内の要素の出現数を数えるです。この質問は、面接官があなたの データ集約を効率的に処理する能力を評価し、NullPointerException のような落とし穴を回避するのに役立ちます。

HashMap を初めて使用する場合は、この投稿に入る前に基礎知識として、私の HashMap の基本の解明: Java 開発者のための重要な概念 を参照してください。

この投稿では、

  • 問題ステートメントを詳しく調べてください。
  • これを 2 つのアプローチで解決します。従来の if-else ソリューションgetOrDefault() メソッドです。
  • 両方の実装の時間と空間の複雑さについて話し合います。
  • 両方のソリューションの
  • 比較 (それぞれをいつ使用するかを含む)。

問題ステートメント

整数のリストが与えられます。あなたのタスクは、

リスト内の各一意の数値とその出現数を返すことです。これは、HashMap データ構造 の理解と、それを効率的に実装する能力をテストする典型的な問題です。

これが例です:

入力

[1、2、3、5、2、1]

出力

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

入力リストが null または空の場合、結果は 空の HashMap を返す必要があります。


解決策 1: if-else を使用した従来のアプローチ

このソリューションでは、HashMap にキーとして数値

がすでに含まれているかどうかを手動でチェックします。存在する場合は、値をインクリメントします。そうでない場合は、値 1 のキーを挿入します。

コード

インポート java.util.ArrayList; java.util.Arraysをインポートします。 java.util.HashMapをインポートします。 java.util.Listをインポートします。 パブリック クラス CountNumbers { private HashMap getCount(List list) { // 数値カウントを保存するために HashMap を初期化します HashMap マップ = new HashMap(); // null リストの場合に NullPointerException を回避するには if (リスト != null) { // リスト内の各数値を反復処理します for (int num : リスト) { // 最初に出現した場合は、数値をカウント 1 で加算します if (!map.containsKey(num)) { マップ.put(数値, 1); } else { // 数値がすでに存在する場合は、その数値を 1 ずつ増やします マップ.put(数値, マップ.get(数値) 1); } } } マップを返す。 } public static void main(String[] args) { // コレクションを引数として ArrayList パラメーター化されたコンストラクターを使用する List 数値 = 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. リストが null の場合: 反復する前にリストが null かどうかをチェックすることで、NullPointerException を回避します。
  2. リストの反復: 各数値について、それが HashMap にすでに存在する場合は、その値をインクリメントします。それ以外の場合は、値 1. を挿入します。

時間と空間の複雑さ

  • 時間計算量:

    • O(n) – リストを 1 回スキャンします。n は要素の数です。
    • 各 HashMap 操作 (put および get) は平均して
    • O(1) かかり、全体的な時間計算量は O(n). になります。
  • 空間複雑度: O(n) – 最悪の場合、すべての数値は一意であり、HashMap に保存されます。


解決策 2: getOrDefault() メソッドを使用した最適化されたアプローチ

Java HashMap クラスは、getOrDefault() メソッドでこの問題を処理するための

より簡潔で簡潔な方法を提供します。キーがマップ内に見つからない場合は デフォルト値 を返すことにより、if-else ロジックの必要性を排除します。

メソッド定義

V getOrDefault(オブジェクト キー, V defaultValue)
{1=2, 2=2, 3=1, 5=1}
  • パラメータ:

      key: 関連付けられた値が返されるキー。
    • defaultValue: マップにキーのマッピングが含まれていない場合に返される値。
  • Returns: 指定されたキーがマップされる値、またはマップにキーのマッピングが含まれていない場合はdefaultValue。

詳細については、HashMap の公式 Javadoc を確認してください。

コード

インポート java.util.ArrayList; java.util.Arraysをインポートします。 java.util.HashMapをインポートします。 java.util.Listをインポートします。 パブリック クラス CountNumbers { private HashMap getCount(List list) { // 数値カウントを保存するために HashMap を初期化します HashMap マップ = new HashMap(); // null リストの場合に NullPointerException を回避するには if (リスト != null) { // リスト内の各数値を反復処理します for (int num : リスト) { // getOrDefault() を使用したよりクリーンなソリューション map.put(num, map.getOrDefault(num, 0) 1); } } マップを返す。 } public static void main(String[] args) { // コレクションを引数として ArrayList パラメーター化されたコンストラクターを使用する List 数値 = 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. getOrDefault() の使用: このメソッドは、キーが存在する場合はキーの値を返します。そうでない場合は、指定された デフォルト値 (この場合は 0) を返します。
  2. 挿入と増分: コードはデフォルト値に 1 を直接追加し、if-else ロジックの必要性を排除します。

getOrDefault() の利点

  • よりクリーンなコード: if-else の必要性を排除することで定型文を削減します。
  • 同じ複雑さ: 時間と空間の両方に対して O(n)

両方のアプローチの比較

側面従来のアプローチgetOrDefault() の使用コードの可読性パフォーマンス使用事例
if-else ロジックを使用した少し冗長な よりわかりやすく、より簡潔に
同じ (O(n)) 同じ (O(n))
すべての Java バージョンで動作します Java 8 以降が必要です

結論

どちらの解決策でも同じ結果が得られますが、

getOrDefault()

を使用すると、コードがより簡潔で読みやすくなります。この質問は、HashMap、反復、および null 値の処理 についての理解を評価するため、面接でよく使われる質問です。また、頻度カウントおよびデータ集計に関連する問題とも密接に関連しています。 この投稿が役立つと思われた場合は、Collections Framework Essentials シリーズの他の投稿もぜひチェックしてください。

関連記事

    Java の基礎
  • アレイ面接の必需品
  • Java メモリの基礎
  • コーディングを楽しんでください!

リリースステートメント この記事は次の場所に転載されています: https://dev.to/arshisaxena26/hashmaps-in-action-tackling-a-common-java-interview-challenge-2757?1 権利侵害がある場合は、[email protected] までご連絡ください。それを削除するには
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3