使用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 +的长度。 ..
答案 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一起使用,只需将数据放入其表中并让它进行连接即可。我认为这个选项对于大数据量来说是最实用的。