我有一个employers列表和一个workers列表组成的数据。每一个人都与另一个人有多到多的关系(所以雇主可以有很多工人,而一个工人可以有很多雇主)。
数据的检索方式(并提供给我)如下:每个employer都有一个workers数组。换言之:
employer n has:
worker x, worker y etc.所以我有一堆雇主对象,每个对象都包含一个工人数组。
我需要转换这些数据(基本上是反转关系)。我需要一堆worker对象,每个对象都包含一个employers数组。换言之:
worker x has:
employer n1, employer n2 etc.上下文是假设的,所以请不要评论为什么我需要这个,为什么我要这样做。我非常希望在算法上帮助执行这个转换(数据不多,所以我更喜欢可读性而不是降低复杂性的复杂优化)。(哦,我正在使用Java,但是伪代码就可以了)。
发布于 2010-06-10 14:18:33
为此您需要一个Map>,或者可能是一个来自番石榴的Multimap。
伪码:
initialize employerMap(worker => set of employers)
for every employer n do
for every worker x in n.workers do
employerMap[x].add(n)实际上,Worker可以映射到多个Employer,所以您可以:
Map<Worker,Set<Employer>> Map中的每个键只能有一个值,所以在本例中的值是一个Set of Map
具有
Multimap的
示例
下面是一个进行映射的示例。请注意,绝对不建议像这样在Object[][] arr中存储数据,并且只作为示例的一部分使用。集中于实际的映射部分。
import java.util.*;
public class MultiMapExample {
public static void main(String[] args) {
Object[][] arr = {
{ "IBM", new String[] { "Joe", "Jack", "Carol" }},
{ "MS", new String[] { "Jack", "Andy", "Carol" }},
{ "Google", new String[] { "Bob", "Alice", "Carol" }},
};
Map<String,Set<String>> employerMap =
new HashMap<String,Set<String>>();
for (Object[] data : arr) {
String employer = (String) data[0];
String[] workers = (String[]) data[1];
for (String worker : workers) {
Set<String> employers = employerMap.get(worker);
if (employers == null) {
employerMap.put(worker, employers = new HashSet<String>());
}
employers.add(employer);
}
}
for (String worker : employerMap.keySet()) {
System.out.println(worker + " works for " + employerMap.get(worker));
}
}
}这种印刷品(顺序可能不同):
Alice works for [Google]
Jack works for [IBM, MS]
Bob works for [Google]
Andy works for [MS]
Carol works for [IBM, Google, MS]
Joe works for [IBM]我建议将数据保存在这样的Map中,但是如果出于某种原因必须将员工列表转换为数组,则可以使用Collection.toArray(T[])。
不过,与数组相比,您通常更喜欢List和其他Java框架类。
equals、hashCode等的实现
上面的示例为了简单起见使用了String。您可能应该使用实际的Worker和Employer类型,这是一件好事。不过,您必须确保它们正确地实现了equals和hashCode。
另请参阅
有效的Java第2版equals项目8:当重写等于
API链接
Object.equals(Object)Object.hashCode()java.lang.Comparable -这里不需要,但是另一个重要的Java合同相关问题
在equals/hashCode组合体上:
论equals对==
发布于 2010-06-10 14:17:26
不是特定于java的,但是下面是这样的方法:
<Worker, Set<Employer>>字典,Dict[Worker] set 在第一次找到每个工作人员时,您需要添加一个检查来创建该集。
https://stackoverflow.com/questions/3015182
复制相似问题