基于Class变量值合并两个Crays数组的最佳方法

时间:2011-10-27 10:38:03

标签: java arrays

使用Java,这是根据类的某个值合并两个类数组的最佳方法吗?

示例,我们有这两个类:

public class C1{
  public String id="";
  public String value="";
  public String tot="";
}

public Class C2{
 public String id="";
 public String tot="";
}

在我们的代码的某些方面,我们有两个数组:

            //id -value - tot
C1 a [] = { {"1","value#1",""}, 
            {"2","value#2",""}, 
            {"3","value#3",""}, 
            {"4","value#4",""}
    };
                //id - tot
    C2 b [] = { {"1","2"}, 
                {"2","11"}, 
                {"4","15"}
};

最终数组应该是:

C1 f [] = { {"1","value#1","2"}, 
            {"2","value#2","11"}, 
            {"3","value#3",""}, 
            {"4","value#4","15"}
};

我试图找出实现此结果的最佳方法,而不是从头到尾读取一个或另一个数组,因为这里两个数组只有很少的行,但实际上它们都可以有100k +的长度。 ..

3 个答案:

答案 0 :(得分:2)

将一个数组放在Map<String, C1>中,其中键为id。遍历另一个数组,在地图中查找id并更新值。如果您使用TreeHashMap,则可以按键按顺序取回值。

答案 1 :(得分:0)

这听起来像是一本教科书的例子,你会用hadoop和map-reduce分发这些东西。根据您的抱负水平和预算水平(以及此操作的时间关键程度),可能值得一试。

答案 2 :(得分:0)

这是数据库引擎为生活所做的事情。让我们看看他们是如何做到的: a)将非常小的数据集与其他数据集连接起来 - 使用嵌套循环。这是效率最低的方式。
b)如果一个集合足够小以适应内存 - 您可以将其作为键值对放在散列映射中,然后在较小的数据集上执行一个路径以查找所有匹配。
c)如果按键对数组进行排序 - 您可以进行合并 - 排序连接。您只需克服两个数据集并查找匹配项。如果一个数组已经排序 - 对第二个数组进行排序可能是有意义的,然后使用此算法。
d)如果两个数据集都太大而无法容纳内存 - 您可以使用宽限哈希连接。您可以通过散列其连接键将两个数据集划分为X个存储桶。如果使用相同的哈希函数,则可以确保只需加入相应的桶。然后使用上述任何技术加入存储桶 e)如果你有非常大的数据集,Hadoop和Map / Reduce是不错的选择。在内部,它将对两个数据集进行排序,然后让您进行连接 f)您可以将Hadoop与Hive一起使用,只需将数据放入其表中并让它进行连接即可。我认为这个选项对于大数据量来说是最实用的。