首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在一个子字符串优先于另一个子字符串的情况下对具有子串变体的数组进行重复数据删除?

如何在一个子字符串优先于另一个子字符串的情况下对具有子串变体的数组进行重复数据删除?
EN

Stack Overflow用户
提问于 2011-10-11 14:02:15
回答 3查看 274关注 0票数 0

我有一个与此类似的数据集:http://pastie.org/private/3u1reg72nnjfsgqzgqzwra

该列表是一组需要处理的文件名。如果一个文件名的子字符串为10u,而另一个文件名的子字符串为2u,则其中包含10u的文件名具有来自带有2u子字符串的文件的数据子集。换句话说,当你有这样的东西时:

代码语言:javascript
复制
20021203_V9ut_2u.txt 
20021203_V9ut_10u.txt 
    or 
V9cd_2u.txt
V9cd_10u.txt

应该从列表中删除20021203_V9ut_10u.txtV9cd_10u.txt,并且列表中应该只保留带有1u的文件名。

我尝试过几种不同的方法,但它们都太像C或hackish了。我还考虑过拆分字符串,然后使用1u10u的值构建散列,然后如果存在包含10u值的键,则将其替换为1u,否则丢弃,然后将散列重新映射到用于处理文件内容的数组。

什么是“最好的”或最红宝石的方式,你能提供一个例子吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-11 14:23:54

如果您的文件列表有时包含的文件不是2u和10u的完美匹配,这将对您有所帮助。如果且仅当存在相应的2u文件时,它才会删除10u文件,否则会将其保留在结果列表中。

代码语言:javascript
复制
files = %w(20021203_V9ut_2u.txt 
20021203_V9ut_10u.txt 
V9cd_2u.txt
V9cd_10u.txt
test1_2u.txt
thing2_10u.txt)

# Reverse sort them if they aren't already that way

files = files.sort {|a,b| b <=> a }

puts files.inspect

scrubbed_files = []
files.each_with_index { |f,i| 
  scrubbed_files << f unless f =~ /(.*)_10u\.(.*)/ && files[i-1] =~ /#{$1}_2u\.#{$2}/
}

puts scrubbed_files.inspect
票数 2
EN

Stack Overflow用户

发布于 2011-10-11 14:08:21

假设您有一个all_filenames数组作为字符串:

代码语言:javascript
复制
filenames_2u = all_filenames.reject!{ |f| f =~ /10u/ } # edited to be actual working ruby

如果您提供的文件是您正在使用的文件,则编辑

代码语言:javascript
复制
all_filenames = IO.readlines('filenames.txt')
票数 2
EN

Stack Overflow用户

发布于 2011-10-12 00:04:16

这种方式更有趣:

代码语言:javascript
复制
a.map {|x| x.split(/_/)}.group_by {|x| x[0...-1]}.map {|_,xx| xx.sort_by {|x| x.last.to_i}.first.join("_")}

也就是说,在下划线处将名称拆分成数组,按词干(直到最后一个下划线的部分)对这些数组进行分组,然后对于每个组,按最后一位的整数版本对名称进行排序,并取第一个。

这将适用于任何Xu编号方案,所以如果你有2u、5u和10u,你就会得到2u版本,如果你有10u和20u,你就会得到10u。

group_by很酷。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7721946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档