首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据转换

数据转换
EN

Stack Overflow用户
提问于 2010-06-10 14:11:45
回答 2查看 2.1K关注 0票数 4

我有一个employers列表和一个workers列表组成的数据。每一个人都与另一个人有多到多的关系(所以雇主可以有很多工人,而一个工人可以有很多雇主)。

数据的检索方式(并提供给我)如下:每个employer都有一个workers数组。换言之:

代码语言:javascript
复制
employer n has:
  worker x, worker y etc.

所以我有一堆雇主对象,每个对象都包含一个工人数组。

我需要转换这些数据(基本上是反转关系)。我需要一堆worker对象,每个对象都包含一个employers数组。换言之:

代码语言:javascript
复制
worker x has:
  employer n1, employer n2 etc.

上下文是假设的,所以请不要评论为什么我需要这个,为什么我要这样做。我非常希望在算法上帮助执行这个转换(数据不多,所以我更喜欢可读性而不是降低复杂性的复杂优化)。(哦,我正在使用Java,但是伪代码就可以了)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-10 14:18:33

为此您需要一个Map>,或者可能是一个来自番石榴的Multimap

伪码:

代码语言:javascript
复制
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
    • 可以将密钥映射到多个values

示例

下面是一个进行映射的示例。请注意,绝对不建议像这样在Object[][] arr中存储数据,并且只作为示例的一部分使用。集中于实际的映射部分。

代码语言:javascript
复制
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));
        }
    }
}

这种印刷品(顺序可能不同):

代码语言:javascript
复制
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框架类。

equalshashCode等的实现

上面的示例为了简单起见使用了String。您可能应该使用实际的WorkerEmployer类型,这是一件好事。不过,您必须确保它们正确地实现了equalshashCode

另请参阅

有效的Java第2版equals项目8:当重写等于

  • 项目9时遵守一般契约:在重写

  • 时始终重写哈希码

API链接

  • Object.equals(Object)
  • Object.hashCode()
  • java.lang.Comparable -这里不需要,但是另一个重要的Java合同

相关问题

equals/hashCode组合体上:

equals==

票数 4
EN

Stack Overflow用户

发布于 2010-06-10 14:17:26

不是特定于java的,但是下面是这样的方法:

  • 制作<Worker, Set<Employer>>字典,
  • 遍历每个雇主的所有员工,
  • 为每个员工添加当前雇主到Dict[Worker] set

在第一次找到每个工作人员时,您需要添加一个检查来创建该集。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3015182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档