[英]How to implement linked list using HashMap in java
如何在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,则无法使用。 谁能解释我在做什么错?
我尝试使用HashTable,但最后他说我应该使用HashMap完成它。
HashTable
是一个旧的Java 1.0类,具有一些不良的特性:
null
键或值... HashMap
允许。 除此之外(以及HashTable
支持旧的Enumeration
API的事实), HashMap
和HashTable
行为几乎相同。 众所周知,使用HashTable
是个坏主意……除非您正在实际需要它的代码库/平台上工作。
因此,面试官(正确地)指出您出于(可能)没有充分的理由而使用了过时的课程。 哎呀!
但是,除非他特别告诉您执行此操作,否则使用任何类型的哈希表实现链接列表都不是一个好主意。
一个简单的链表很容易在纯Java中从头开始实现。 那就是你应该做的。
大得多哦!!!
愚蠢的面试问题。
我能想到的最简单的方法是存储键中每个值的“索引”,然后将该值存储为值。
必须从外部维护头尾索引,但这并不令人惊讶。
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;
}
剩下的作为练习留给读者。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.