一个算法的问题

一个算法的问题

问题描述:

现有如下数据集合,一共8行,
null grade:one null null null null null null null null null null null null null null null

null class:101 null null null null null null null null null null null null null null null

null null null null null grade:one null null null null null null null null null null null

null null null null null class:102 null null null null null null null null null null null

null null null null null null null null null grade:two null null null null null null null

null null null null null null null null null class:101 null null null null null null null

null null null null null null null null null null null null null grade:two null null null

null null null null null null null null null null null null null class:102 null null null

想合并成如下结果,数据只有2行,
null grade:one null null null grade:one null null null grade:two null null null grade:two null null null

null class:101 null null null class:102 null null null class:101 null null null class:102 null null null

这个算法如何写比较好?谢谢

[quote]如果不只2行,有3行甚至更多,二维数组还行吗?[/quote]
道理是一样的,不一定非要二维数组

每行一个数组不就完了嚒,你的结果要合并为2行 那就new 两个数组,三行就三个数组

再在外面套一个ArrayList,每合并得到一个新的数组aaa就ArrayList.add(aaa),这样就不需要考虑最后结果要几行了嚒

看样子是要奇数行合为一行,偶数行合为一行。定义二维数组,读出非null的合并。

我理解的你的合并两行的原理应该是:

每一列的第一个非null数据放在第一行,第二个放在第二行,列值和原来一致。
[code="java"]
a[1,0] = grade:one
a[1,1] = class:101
a[5,2] = grade:one
a[5,3] = class:102
a[9,4] = grade:two
a[9,5] = class:101
a[13,6] = grade:two
a[13,7] = class:102

b[1,0] = a[1,0]
b[1,1] = a[1,1]
b[5,0] = a[5,2]
b[5,1] = a[5,3]
b[9,0] = a[9,4]
b[9,1] = a[9,5]
[/code]

其实有写规律,但是不知道你的最终数据的愿意是什么,如何生存这两行的,像我理解的那样吗,只有了解这个才能写算法。

原始数据的存储格式是什么,最终想获得怎样的格式?
都是逐行存在文件中吗?

[quote]如果不只2行,有3行甚至更多,二维数组还行吗?[/quote]
多少行都可以的,看你输出的结果,发现规律应该就是奇数行合并为一行,偶数行合并为一行,至于合并的规则就是合并后的每行第一个元素为null,然后将原先行中的非null的由三个null元素分隔开,最后三个元素仍然是null。

[quote]
null grade:one null null null null

null class:101 null null null null

null null null null null grade:one

null null null null null class:102

null null null null null null

null null null null null null

null null null null null null

null null null null null null

========================================================

null grade:one null null null grade:one

null class:101 null null null class:102

[/quote]

很明显是纵向平移的关系。 你可以这么思考,下面的二维是一个池子栈,让上面的数据自由落体的话,落入下面对象的列中,如果先到则在底层,后有就就会在它上面一层。遮掩同理如果结果为三行:

[quote]
null grade:one null null null null

null class:101 null null null null

null class:xxx null null null grade:one
null null null null null class:102
null null null null null class:yyy
null null null null null null

null null null null null null

null null null null null null

======================================================

null grade:one null null null grade:one
null class:101 null null null class:102
null class:xxx null null null class:yyy

[/quote]

至于这个自由的列落体运动用算法如何实现,
1)比较笨的方法就是,循环遍历列,从后往前,发现有值就塞入结果列表中多对于的列中的最后一个元素。

2) 你可以考虑用链表,中间的那些null是空元素,然后你要做的是把劣种所有的空元素去除,然后最终
[quote]
grade:one
class:101
class:xxx
null

null =====》
null

null

null

[/quote]

[quote]
grade:one
class:101
class:xxx
[/quote]

[quote]
null

null

grade:one
class:102
class:yyy =============》
null

null

null

[/quote]

[quote]
grade:one
class:102
class:yyy
[/quote]

这样最终就之只剩下三行了