我有一个超过2列的表(比方说A,B和C)。一列包含一些数字(C),我想做一个“分组依据”,如分组,用C求和数字,但我不知道这样做的算法。
我尝试按每列排序表(从最后一个到第一个,除了数字列(C),所以在这种情况下:排序(B)然后排序(A))然后,{{1}第一行在A和B中保存与n
行中相同的值,我将n-1
行中的数字添加到n
行(在C列中),然后删除n-1
行。n
行。否则,如果行n
中的A或B值与n-1
行中的A或B值不同,我将移动到下一行。然后我重复算法直到表格的最后一行。但不知怎的,这一直不起作用,特别是当有更多的列时(某些行保持未分组,可能是因为排序方法)。
我想知道这是否是一个好的分组算法,我需要在排序方法中查找问题,或者我需要使用另一个(排序和/或分组)算法以及哪一个。谢谢。
LE:显然我使用的算法在彻底检查代码并修复像我这样的初级程序员经常犯的一些小错误后效果很好:)
答案 0 :(得分:2)
我认为这样做的好方法是将行包装成一个类,实现equals方法,然后使用Map来添加值:
public class MyRow {
private Long columnA;
private String columnB;
private int columnC;
@Override
public boolean equals(final Object other) {
if (!other instanceof MyRow) {
return false;
}
final MyRow otherRow = (MyRow) other;
return this.columnA.equals(otherRow.getColumnA()) && this.columnB.equals(otherRow.getColumnB);
}
}
然后你可以迭代所有行,并创建一个Map来保存C的总和。
final Map<MyRow, Integer> computedCSums = new HashMap<MyRow, Integer>();
for (final MyRow myRow : myRows) {
if (computedCSums.get(myRow) == null) {
computedCSums.put(myRow, myRow.getColumnC());
} else {
computedCSums.put(myRow, computedSums.get(myRow) + myRow.getColumnC());
}
}
然后,要获得任何行的分组C的总和,您只需:
computedCSum.get(mySelectedRow);
答案 1 :(得分:0)
我认为关于分组应该考虑三件事情
少于或等于抽象
比较两行A,B根据列(C1..Cn)是这样的:比较从C1到Cn的每一列,如果我们可以得到哪个更少,然后返回,或者如果两个值相等,那么我们去比较下一步,重复此操作直到返回。
我们选择哪种算法 1)构建二元搜索树或哈希表来存储元组,当我们得到一个元组时,搜索相等的元组,如果有的话,然后合并具有相同组值的元组,否则将它放到我们的搜索结构中/> 2)读取一些元组,然后排序,遍历缓冲区并合并同一组 我更喜欢1而不是2。
内存大小
如果输出很大,我们必须考虑内存限制。
我们可以使用合并算法来处理这个问题。
如果内存超出我们的限制,则将其内存中的元组按其组列写入磁带顺序
当我们读完输入时,然后将结果集合并到磁带中。