0

JavaでHashMapを使用してリンクリストを作成するにはどうすればよいですか? オンラインで検索したところ、LinkedList データ構造を使用した実装があります。インタビュアーは、LinkedList データ構造を使用せずに実装するように依頼しました。私は HashTable を使用しようとしましたが、最後に彼は HashMap を使用する必要があると言いました。

回答ありがとうございます。

あなたのコメントを読んだ後、私はこれをしました:

public class hashMap {
    static Map<Integer, Integer> mMap = new HashMap<Integer, Integer>();

        public static void main(String[] args) {
        int a;

        mMap.put(1, 2);
        mMap.put(2, 3);
        mMap.put(3, 4);
        mMap.put(4, 7);
        mMap.put(7, 8);

        Scanner in = new Scanner(System.in);
        System.out.println("Enter: ");
        a = in.nextInt();

            itera();

                    if(mMap.containsKey(a)) {
                add.insert(a);

            }
                else if (!mMap.containsKey(a)) {
                add.remove(a);

            }

        itera();
    }

    public static void itera() {
        for (Iterator<Integer> iter = (Iterator<Integer>) mMap.keySet().iterator(); iter.hasNext();) {

            int key = iter.next();
            int sa = mMap.get(key);
            System.out.println(key + " : " + sa);
        }

    }
    static class add {
    public static void insert(int a) {
        int s = a-1;
        int newKey = s; 
        int sa = mMap.get(a);
        mMap.put(newKey, sa);
        mMap.remove(a);
    }

    public static void remove(int a) {
        int newa = a;
        while(!mMap.containsKey(a)) {
            a--;
            System.out.println("while a: " + a);

        }

        mMap.put(newa, mMap.get(a));

        mMap.put(a, newa);

    }
}


}

ノードをリンクリストに挿入および削除するだけです。ただし、キーに 5 と 6 がないなど、一部のキーが欠落している場合は問題があります。したがって、6 を挿入しようとしても機能しません。誰かが私が間違っていることを説明できますか?

4

2 に答える 2

4

私は HashTable を使用しようとしましたが、最後に HashMap を使用するべきだったと彼は言いました。

HashTableは、いくつかの望ましくないプロパティを持つ古い Java 1.0 クラスです。

  • すべての操作が同期されます ... 通常は必要ありません
  • クラスはnullキーまたは値を許可しません...許可しますHashMap

HashTableそれ(および古いEnumerationAPI をサポートしているという事実)HashMapを除けば、HashTableほとんど同じように動作します。実際にそれを必要HashTableとするコードベース/プラットフォームで作業している場合を除き、使用するのは悪い考えであることはよく知られています。

したがって、インタビュアーは、あなたが (おそらく) 正当な理由もなく時代遅れのクラスを使用したことを (正しく) 指摘しています。おっと!


しかし、彼が特にそうするようにあなたに言わない限り、あらゆる種類のハッシュ テーブルを使用してリンク リストを実装することは、かなり悪い考えです。

  • あいまいです
  • 不必要に複雑です
  • 非効率です
  • データ構造とアルゴリズムの理解が不十分であることを強く示唆しています。

単純な連結リストは、単純な Java でゼロから簡単に実装できます。それはあなたがすべきだったことです。

はるかに大きい

于 2013-05-20T02:04:32.143 に答える
0

愚かなインタビューの質問.

私が考えることができる最も簡単な方法は、各値の「インデックス」をキーに格納し、値を値として格納することです。

頭と尾のインデックスを外部から維持する必要がありますが、それはそれほど驚くべきことではありません。

Add は次のようになります。

public void add(V value) {
    _map.put(_tail, value);
    _tail += 1;
}

削除する:

public boolean remove(V value) {
    Iterator<Map.Entry<Integer,V>> _map.entrySet().iterator();
    while( iter.hasNext() ) {
        Map.Entry<Integer,V> entry = iter.next();
        if( value.equals(entry.getValue()) ) {
            iter.remove();
            return true;
        }
    }
    return false;
}

残りは読者の演習として残しておきます。

于 2013-05-20T02:00:59.087 に答える