快速而简单的一个..我有一个我需要清理的文本文件......
这是输入数组
[["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]
所需的输出数组
[["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"]]
如何使用简单的代码进行操作...删除与列[0..4]匹配的重复行与数组的其余部分。干杯
答案 0 :(得分:4)
您可以向Array#uniq
提供一个块,以指定要查看的属性。因此,为了删除基于前5列的任何重复项,您只能执行以下操作:
input = [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]
input.uniq { |e| e[0..4] }
# [
# ["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
# ["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"]
# ]
答案 1 :(得分:3)
这是一种方法:
arr.map { |e| e[0..-2] << "Time1" }.uniq
或
arr.map { |e| e[0..-2] }.uniq.map { |e| e << "Time1" }
答案 2 :(得分:1)
您可以使用Set类来处理此问题。
这是我的解决方案:
require 'set'
a = [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]
s = Set.new
a.delete_if { |x| s.size == s.add(x[0..4]).size }
答案 3 :(得分:0)
您可以使用 uniq {| item | ...}→new_ary 。我通过例子解释:
a = [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]
a.uniq {|s| s[0] && s[1] }
# => [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"], ["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"]]
有关详细信息,请参阅http://ruby-doc.org/core-1.9.3/Array.html。
答案 4 :(得分:-1)
a = [["10/10/2013", "u1", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_1"],
["10/10/2013", "u1", "m1", "app1", "IN", "Time_2"],
["10/10/2013", "u2", "m1", "app1", "IN", "Time_2"]]
a.uniq {|s| s[0..1] }