A small coding test that I encountered today.

Question

Using only primitive types, implement a fixed-size hash map that associates string keys with arbitrary data object references (you don't need to copy the object). Your data structure should be optimized for algorithmic runtime and memory usage. You should not import any external libraries, and may not use primitive hash map or dictionary types in languages like Python or Ruby.

The solution should be delivered in one class (or your language's equivalent) that provides the following functions:

  • constructor(size): return an instance of the class with pre-allocated space for the given number of objects.
  • boolean set(key, value): stores the given key/value pair in the hash map. Returns a boolean value indicating success / failure of the operation.
  • get(key): return the value associated with the given key, or null if no value is set.
  • delete(key): delete the value associated with the given key, returning the value on success or null if the key has no value.
  • float load(): return a float value representing the load factor (`(items in hash map)/(size of hash map)`) of the data structure. Since the size of the dat structure is fixed, this should never be greater than 1.

If your language provides a built-in hashing function for strings (ex. `hashCode` in Java or `__hash__` in Python) you are welcome to use that. If not, you are welcome to do something naive, or use something you find online with proper attribution.

Solution

Key to construct a hash map is to construct several key-value entries.

 package datastructures.map;

 public class MyEntry<K, V> {
private final K key;
private V value; public MyEntry(K key, V value) {
this.key = key;
this.value = value;
} public K getKey() {
return key;
} public V getValue() {
return value;
} public void setValue(V value) {
this.value = value;
}
}
 package datastructures.map;

 // import datastructures.map.MyEntry;

 public class MyMap<K, V> {
private int fullSize;
private int size;
private int DEFAULT_CAPACITY = 16; private MyEntry<K, V>[] map = new MyEntry[DEFAULT_CAPACITY]; public MyMap(int size) {
this.size = 0;
this.map = new MyEntry[size];
this.fullSize = size;
} public V get(K key) {
for (int i = 0; i < size; i++) {
if (map[i].getKey().equals(key)) {
return map[i].getValue();
}
}
return null;
} public boolean set(K key, V value) {
boolean insert = true;
for (int i = 0; i < size; i++) {
if (map[i].getKey().equals(key)) {
map[i].setValue(value);
insert = false;
}
}
if (insert) {
if (size >= fullSize) {
return false;
}
else {
map[size] = new MyEntry(key, value);
size++;
}
}
return true;
} public V delete(K key) {
for (int i = 0; i < size; i++) {
if (map[i].getKey().equals(key)) {
V value = map[i].getValue();
map[i] = null;
condenseArray(i);
return value;
}
}
return null;
} public float load() {
return (float)size / (float)fullSize;
} private void condenseArray(int start) {
size--;
for (int i = start; i < size; i++) {
map[i] = map[i + 1];
}
} }
 package datastructures.map;

 public class Test {
public static void main(String[] args) {
int size = 8;
MyMap<Character, Integer> test = new MyMap<Character, Integer>(size);
test.set('a', 1);
test.set('b', 2);
test.set('c', 3);
test.set('d', 4);
System.out.println(test.get('a'));
System.out.println(test.set('a', 2));
System.out.println(test.get('a'));
System.out.println(test.load());
test.delete('b');
System.out.println(test.load());
}
}

More basic knowledge about Java

Package and Import

Classes under same package need not import each other.

Here, we set three classes in package datastructures.map, and my current path is /home/Desktop

Then, I need to make a directory of datastructures/map under Desktop and put three source codes in that directory.

Meanwhile, I need to compile under Desktop directory.

Tutorialspoint

To compile the Java programs with package statements you have to do use -d option as shown below.

javac -d Destination_folder file_name.java

There can be only one package statement in each source file, and it applies to all types in the file.

Two major results occur when a class is placed in a package:

1. The name of the package becomes a part of the name of the class, as we just discussed in the previous section.

2. The name of the package must match the directory structure where the corresponding bytecode resides.

Constructor

Constructor for object should not include inner types.

For example

public MyMap<K, V>() {}           is wrong!

public MyMap() {}         is right!

Public Class

(referrence: Tutorialspoint)

Four access level for classes:

1. Visible to the package. the default. No modifiers are needed.

2. Visible to the class only (private).

3. Visible to the world (public).

4. Visible to the package and all subclasses (protected).

Access Control and Inheritance:

1. Methods declared public in a superclass also must be public in all subclasses.

2. Methods declared protected in a superclass must either be protected or public in subclasses; they cannot be private.

3. Methods declared without access control (no modifier was used) can be declared more private in subclasses.

4. Methods declared private are not inherited at all, so there is no rule for them.

Implement Hash Map Using Primitive Types的更多相关文章

  1. Hash Map (Hash Table)

    Reference: Wiki  PrincetonAlgorithm What is Hash Table Hash table (hash map) is a data structure use ...

  2. Java中的原始类型(Primitive Types)与引用类型(Reference Values)

    Java虚拟机可以处理的类型有两种,一种是原始类型(Primitive Types),一种是引用类型(Reference Types). 与之对应,也存在有原始值(Primitive Values)和 ...

  3. Effective Java 49 Prefer primitive types to boxed primitives

    No. Primitives Boxed Primitives 1 Have their own values Have identities distinct from their values 2 ...

  4. How to Map Distinct Value Types Using Java Generics--reference

    原文:http://www.codeaffine.com/2015/03/04/map-distinct-value-types-using-java-generics/ Occasionally t ...

  5. hdu1381 Crazy Search(hash map)

    题目意思: 给出一个字符串和字串的长度,求出该字符串的全部给定长度的字串的个数(不同样). 题目分析: 此题为简单的字符串哈hash map问题,能够直接调用STL里的map类. map<str ...

  6. C# 01 Primitive Types and Expressions

    Class Data or Attributes state of the application Methods or Functions have behavior Namespace is a ...

  7. [LeetCode] Repeated DNA Sequences hash map

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

  8. Hash Map 在java中的解释及示例

    目录 HashMap在java中的应用及示例 HashMap的内部结构 HashMap的性能 同步HashMap HashMap的构造函数 HashMap的时间复杂度 HashMap的方法 1. vo ...

  9. Redis的增删改查 c# key value类型和hash map 类型

    using Newtonsoft.Json; using StackExchange.Redis; using System; using System.Collections.Generic; us ...

随机推荐

  1. CentOS6.4安装mplayer

    1.准备软件 mplayer官网:http://www.mplayerhq.hu/design7/news.html RPM Fusion网址:http://rpmfusion.org/ EPEL网址 ...

  2. POJ 1631 Bridging signals DP(最长上升子序列)

    最近一直在做<挑战程序设计竞赛>的练习题,感觉好多经典的题,都值得记录. 题意:给你t组数据,每组数组有n个数字,求每组的最长上升子序列的长度. 思路:由于n最大为40000,所以n*n的 ...

  3. Hibernaate事务管理

    Hibernate使用session时需要继承HibernateDaoSupport对象 HibernateDaoSupport对象中包含默认的getSession()方法,但不可以通过该方法直接启动 ...

  4. [Immutable.js] Transforming Immutable Data with Reduce

    Immutable.js iterables offer the reduce() method, a powerful and often misunderstood functional oper ...

  5. ArrayList的分析(转)

    一. ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境 ...

  6. Docker网络管理-外部访问容器

    注意:这里使用的方法是端口映射,需要说明的是端口映射是在容器启动的时候才能完成端口映射的. 1,搭建1个web服务器,让外部机器访问. docker run -itd centos /bin/bash ...

  7. (转载)js获取JqueryString方法小结

    一.<script>urlinfo=window.location.href; //获取当前页面的urllen=urlinfo.length;//获取url的长度offset=urlinf ...

  8. Android 开源框架

    不推荐使用UltimateAndroid.KJFrameForAndroid.ThinkAndroid.Afinal.xUtil等这种集成网络请求.图片加载.数据库ORM.视图依赖注入.UI框架等的集 ...

  9. 关于iOS9之后的loadViewIfNeeded

    iOS9之前 有些时候因为需要手动调用loadview 但是有风险,系统不再调用viewDidLoad 所以手动调用loadview是错误的 iOS9之后出现了loadViewIfNeeded解决了这 ...

  10. UICollectionView的简单使用和常用代理方法

    UICollectionView相对于UITableView有更加自由的布局,做出的界面可变性更大最近开始接触使用UICollectionView,整理了一下常用的代理方法 首先需要先添加UIColl ...