数据排列组合 求一算法
本帖最后由 yccpp 于 2015-2-4 22:50 编辑本人想用fortran进行数据的重新排列组合,向大神求一算法。原始数据是多行两列的数据,想把有公共数据的行写成一行且公共数据只出现一次。关键是公共数据不是固定的,下面是一个小例子,第一行和第二行的第一列有相同数22875,而第一行第二列的数据30588又出现在了第五行和第六行,需要把这些数据写成一行,如果没有公共数据,就按原始数据写出。整个数据文件见附件。非常感谢您的帮助!
原始数据22875 30588 22875 34747 22912 3485122963 35901 22969 3058830588 4079130609 39143 30609 40808
重新排列后的输出22875 30588 34747 2296940791 22912 34851 22963 3590130609 39143 40808 不知为何我打开时背景是红色的,编辑时也没法调 我打开看是正常的,不是红色的。不需要编辑。
有一个疑问:
如果出现一行,第一个数据是未出现过的,而第二个是出现过的。如何处理?
比如你的算例,下面加一行:
35555 22963
其中 22963 出现过,而 35555 未出现过。
谢谢VVT,按你说的,如果下面加一行 35555 22963,也要加在一起,输出结果的第三行就变为 22963 35901 35555.谢谢关注。 Program www_fcode_cn
Implicit None
Integer , parameter :: N = 15749!// 行
Integer , parameter :: N_rows = N !// 行
Integer :: idata( 2 , N ) , idata_row( 2 , N )
Integer :: currRow , i , j , k
Logical :: b( 2 )
currRow = 0
Open( 12 , File = "Number.txt" )
Open( 13 , File = "Number1.txt" )
Do i = 1 , N
Read( 12 , * ) idata( : , i )
j = 0
b = .false.
Do j = 1 , i-1
b(1) = ( any( idata(1,i) == idata(:,j) ) )
b(2) = ( any( idata(2,i) == idata(:,j) ) )
if ( any(b) ) exit
End Do
if ( j > 0 .and. j <= i-1 ) then
if( b(1) .and. .NOT.b(2) ) then
idata_row( 1 , i ) = 0
idata_row( 2 , i ) = idata_row( 1 , j )
elseif( b(2) .and. .NOT.b(1) ) then
idata_row( 2 , i ) = 0
idata_row( 1 , i ) = idata_row( 2 , j )
else
idata_row( : , i ) = 0
end if
else
currRow = currRow + 1
idata_row( : , i ) = currRow
end if
End Do
Do i = 1 , currRow
Do j = 1 , N
if ( idata_row(1,j) == i ) then
write( 13 , '(g0,1x)' , advance='no' ) idata(1,j)
end if
if ( idata_row(2,j) == i ) then
write( 13 , '(g0,1x)' , advance='no' ) idata(2,j)
end if
End Do
write(13,*)
End Do
Close( 12 )
Close( 13 )
End Program www_fcode_cn 谢谢fcode的帮助。 fcode你好,运行你的程序后,感觉没有判断完全,可能是我没有把问题描述清楚,在输入文件中,如果a 和b是一对,b和c是一对, c和d是一对, a和c是一对, b和d是一对,以此类推,则在输出时把这些数据都归在一起写在一行。谢谢,祝春节快乐! 你最好是结合实例来说明你的需求。
列举几个数字,告诉我排列后应该是什么样子? 谢谢fcode,下面是从我的附件中摘取的一组应该写在一起的数据,他们在number文件中的形式是
33035 40381
33035 44096
38659 44165
40374 40381
40381 48872
44165 53155
48872 53155
48872 54478
48872 56608
53155 60902
54478 56608
54478 60902
每一组数据中都有一个数据与另外至少一组数据中的一个数据相同,则把这些数据写在一起,输出后的形式为
33035 38659 40374 40381 44096 44165 48872 53155 54478 56608 60902
谢谢。 用我的代码执行后,输出为 2 行:
33035 40381 44096 40374 48872
38659 44165 53155
你能说说为什么要写成1行吗?
页:
[1]
2