Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果标签相同,则合并文件的时间戳_Java_Python_Algorithm_Groovy - Fatal编程技术网

Java 如果标签相同,则合并文件的时间戳

Java 如果标签相同,则合并文件的时间戳,java,python,algorithm,groovy,Java,Python,Algorithm,Groovy,我有三列文件,第一列和第二列是时间的开始和结束,第三列是标签。如果第3列中的标签相同,我想合并连续行(2个或更多)的时间戳 输入1: 0.0000000.551875 x 0.551875 0.586875 x 0.586875 0.676188吨 0.676188 0.721875吨 0.721875 0.821250吨 0.821250 0.872063便士 0.872063 0.968625 q 0.968625 1.112250 q 输入2: 0.0000000.551875 x

我有三列文件,第一列和第二列是时间的开始和结束,第三列是标签。如果第3列中的标签相同,我想合并连续行(2个或更多)的时间戳

输入1:

0.0000000.551875 x
0.551875 0.586875 x
0.586875 0.676188吨
0.676188 0.721875吨
0.721875 0.821250吨
0.821250 0.872063便士
0.872063 0.968625 q
0.968625 1.112250 q

输入2:

0.0000000.551875 x
0.551875 0.586875 x
0.586875 0.676188吨
0.676188 0.721875吨
0.721875 0.821250吨
0.821250 0.872063便士
0.872063 0.968625 q
0.968625 1.112250 q
1.112250 1.212250 x
1.212250 1.500000 x

输入3:

0.0000000.551875 x
0.551875 0.586875 x
0.586875 0.676188吨
0.676188 0.721875吨
0.721875 0.821250吨
0.821250 0.872063 oo
0.872063 0.968625 q
0.968625 1.112250 q
1.112250 1.212250 x
1.212250 1.500000 x

输出

0.0000000.586875 x
0.586875 0.821250吨
0.821250 0.872063便士
0.872063 1.112250 q
1.112250 1.500000 x

在Groovy中,给定:

def inputs = [
    [0.000000, 0.551875, 'x'],
    [0.551875, 0.586875, 'x'],
    [0.586875, 0.676188, 't'],
    [0.676188, 0.721875, 't'],
    [0.721875, 0.821250, 't'],
    [0.821250, 0.872063, 'p'],
    [0.872063, 0.968625, 'q'],
    [0.968625, 1.112250, 'q']
]
只需按照每个列表中的第三个元素对它们进行分组,然后为每个组创建一个包含以下内容的列表:

  • 第一个列表的第一项
  • 最后一个列表的第二项
  • 它们分组所依据的键
给予:

def outputs = inputs.groupBy { it[2] }.collect { key, items ->
    [items[0][0], items[-1][1], key]
}
其结果是:

[[0.000000, 0.586875, 'x'],
 [0.586875, 0.821250, 't'],
 [0.821250, 0.872063, 'p'],
 [0.872063, 1.112250, 'q']]
缺口 如果您的输入可以有您想要保持的间隙,那么您可以尝试

def inputs = [[0.000000, 0.551875, 'x'],
              [0.551875, 0.586875, 'x'], 
              [0.586875, 0.676188, 't'], 
              [0.676188, 0.721875, 't'], 
              [0.721875, 0.821250, 't'], 
              [0.821250, 0.872063, 'p'], 
              [0.872063, 0.968625, 'q'], 
              [0.968625, 1.112250, 'q'], 
              [1.112250, 1.551875, 'x'], 
              [1.551875, 2.000000, 'x']]

def outputs = inputs.inject([]) { accum, line ->
    if(accum && accum[-1][2] == line[2]) {
        accum[-1][1] = line[1]
    }
    else {
        accum << line
    }
    accum
}
通配符 给出:

[[0.000000, 0.586875, 'x'],
 [0.586875, 0.872063, 't'],
 [0.872063, 1.112250, 'q'],
 [1.112250, 2.000000, 'x']]

给予

在Groovy中,给定:

def inputs = [
    [0.000000, 0.551875, 'x'],
    [0.551875, 0.586875, 'x'],
    [0.586875, 0.676188, 't'],
    [0.676188, 0.721875, 't'],
    [0.721875, 0.821250, 't'],
    [0.821250, 0.872063, 'p'],
    [0.872063, 0.968625, 'q'],
    [0.968625, 1.112250, 'q']
]
只需按照每个列表中的第三个元素对它们进行分组,然后为每个组创建一个包含以下内容的列表:

  • 第一个列表的第一项
  • 最后一个列表的第二项
  • 它们分组所依据的键
给予:

def outputs = inputs.groupBy { it[2] }.collect { key, items ->
    [items[0][0], items[-1][1], key]
}
其结果是:

[[0.000000, 0.586875, 'x'],
 [0.586875, 0.821250, 't'],
 [0.821250, 0.872063, 'p'],
 [0.872063, 1.112250, 'q']]
缺口 如果您的输入可以有您想要保持的间隙,那么您可以尝试

def inputs = [[0.000000, 0.551875, 'x'],
              [0.551875, 0.586875, 'x'], 
              [0.586875, 0.676188, 't'], 
              [0.676188, 0.721875, 't'], 
              [0.721875, 0.821250, 't'], 
              [0.821250, 0.872063, 'p'], 
              [0.872063, 0.968625, 'q'], 
              [0.968625, 1.112250, 'q'], 
              [1.112250, 1.551875, 'x'], 
              [1.551875, 2.000000, 'x']]

def outputs = inputs.inject([]) { accum, line ->
    if(accum && accum[-1][2] == line[2]) {
        accum[-1][1] = line[1]
    }
    else {
        accum << line
    }
    accum
}
通配符 给出:

[[0.000000, 0.586875, 'x'],
 [0.586875, 0.872063, 't'],
 [0.872063, 1.112250, 'q'],
 [1.112250, 2.000000, 'x']]

给予


谢谢你,但我认为我的数据有更多的可变性。标签可以用单行或连续行重复def输入=[[0.000000,0.551875,'x'],[0.551875,0.586875,'x'],[0.586875,0.676188,'t'],[0.676188,0.721875,'t'],[0.721875,0.821250,'t'],[0.821250,0.872063,'p'],[0.872063,0.968625,'q'],[0.968625,1.112250,'q'],[1.112250,'x'],[1.821250,'kkkkhh']。。。一秒钟。。。因此,您不希望在中间间隙中使用<代码> y>代码> <代码> x >代码>行,以将其分组为一行?它们应该保持两个独立的
x
组?请参见输入2:格式。我在底部添加了其他行。@KKK您能试试第二种解决方案吗?这更像是你的意思吗?当你按标签分组时,输出不是你想要的,所以它合并了标签的每一次出现和持续时间。我只想合并,如果他们是连续的,并通过整个文件。感谢这一点,但我认为我有更多的可变性的数据。标签可以用单行或连续行重复def输入=[[0.000000,0.551875,'x'],[0.551875,0.586875,'x'],[0.586875,0.676188,'t'],[0.676188,0.721875,'t'],[0.721875,0.821250,'t'],[0.821250,0.872063,'p'],[0.872063,0.968625,'q'],[0.968625,1.112250,'q'],[1.112250,'x'],[1.821250,'kkkkhh']。。。一秒钟。。。因此,您不希望在中间间隙中使用<代码> y>代码> <代码> x >代码>行,以将其分组为一行?它们应该保持两个独立的
x
组?请参见输入2:格式。我在底部添加了其他行。@KKK您能试试第二种解决方案吗?这更像是你的意思吗?当你按标签分组时,输出不是你想要的,所以它合并了标签的每一次出现和持续时间。我只想合并,如果他们是连续的,并通过文件。