Java的HashMap的索引2键

我想在Java中创建一个HashMap为用户的喜好。 这将是很容易做到在数据库中,但不幸的是,我不能使用一个数据库。 我需要的是一个方法来按名称查找HashMap中的一个用户,并找到所有的用户提供了一定的兴趣(如高尔夫球场)。 如果我删除用户,那么他们的所有利益应当被删除。

任何人都知道一个很好的方法,使这个数据结构?

--------------解决方案-------------

你知道你真的需要有第二个索引。 您可能会发现,搜索每一个用户的是速度​​不够快,除非你拥有数百万用户。

下面的示例使用51微秒来扫描1000个用户。 它采用557微秒,扫描10,000个用户。

我不会建议优化集合,直到你知道它是否会有所作为。

import java.util.*;
import java.io.*;

public class TestExecutor {
public static void main(String[] args) throws IOException {
Map<String, User> users = new LinkedHashMap<String, User>();
generateUsers(users, 1000, 0.1);

// warmup.
int count = 10000;
for(int i=0;i< count;i++)
getAllUsersWithInterest(users, Interest.Golf);

long start = System.nanoTime();
for(int i=0;i< count;i++)
getAllUsersWithInterest(users, Interest.Golf);
long time = System.nanoTime() - start;
System.out.printf("Average search time %,d micro-seconds%n", time/ count/1000);
}

private static Set<User> getAllUsersWithInterest(Map<String, User> users, Interest golf) {
Set<User> ret = new LinkedHashSet<User>();
for (User user : users.values()) {
if (user.interests.contains(golf))
ret.add(user);
}
return ret;
}

private static void generateUsers(Map<String, User> users, int count, double interestedInGolf) {
Random rand = new Random();
while(users.size() < count) {
String name = Long.toString(rand.nextLong(), 36);
EnumSet<Interest> interests = rand.nextFloat() < interestedInGolf
? EnumSet.of(Interest.Golf) : EnumSet.noneOf(Interest.class);
users.put(name, new User(name, interests));
}
}

static class User {
private final String name;
private final Set<Interest> interests;

User(String name, Set<Interest> interests) {
this.name = name;
this.interests = interests;
}
}

enum Interest {
Golf
}
}

我建议你​​创建自己的数据结构,用于保存信息。 在那个类,你可以有两个HashMaps这样存储的相关信息。 然后写你自己的方法插入和删除用户。

这种方式你在插入/删除-操作,同时能够查询每一个单独的属性控制。

最简单的解决方法是使用一个共享集合MultiKeyMap即使缺乏仿制药。

...查看该线程太泛型化,公共收集

好像你可以使用类似的双向映射来实现这样的事情。 查看 http://google-collections.googlecode.com/svn/trunk/javadoc/index.html?com/google/common/collect/BiMap.html 对于一些多科。

虽然它不给你正是你需要的问题,它有一半的方式。

这可能是矫枉过正您的需求,但我不知道您的需求是多么复杂和速度感应是,所以我把它扔出去那里...

你有没有考虑寻找一个内存中(或基于类似的SQLite甚至本地磁盘)的数据库来处理你的数据。 这样做将允许你存储数据的方式,让更多的权力你如何搜索/索引你的数据,没有太多编写自己的代码的成本。

只要把用户在一个ArrayList,走了它,直到你找到一个你需要的(S)。 给每个用户组的利益。 一旦你获得足够多的用户,它的时间太长,对它们进行排序。

一旦时间过长,看一看的利益分配。 如果你有不同的人数量较少,它们存储在一个位图。 如果你有一组的利益组合有限,单独存放,给用户的其中之一。

从简单的开始,电脑的速度快。 但是,隐藏实现,这样你就可以改变它。

[嗯,让张反对票此。 看问题:你需要大量的用户在此之前的代码是作为一个数据库一样慢。 (关于当前的硬件,至少几十万)

我会实现以下

HashMap中包括用户为键和值可能是该模块主要包括了的UserPreferences任何对象。 用户偏好将包括例如感兴趣的列表。

和一个额外的HashMap有兴趣的关键和用户谁对这个有兴趣的名单。

当你DELET用户,你可以得到所有他有兴趣,并从利益HashMap的列表中删除用户名。 当利息HashMap的列表是空的,你可以DELET从HashMap中的利益。

请注意,当两个或多个用户具有相同的兴趣。 你不能DELET当只有一个用户被删除的兴趣。

缺点是,你将有多余的信息。

你可以使用2 HashMaps这样。 但仅搜索槽偏好可能是复杂的。

HashMap <String,Hashmap> users;

//save data
//create new user
HashMap <String,String> prefs;
//save prefs
prefs.put(pref1,value1);
prefs.put(pref2,value2);
//save user
users.put(user1,prefs);

//get data
String x = users.get(user1).get(pref1);

也许你并不需要这个解决方案了,但很多人还是有同样的问题。

分类:java的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.657 (s). 10 q(s)