在包含数十万个条目的列表中,如何将每个条目与列表的其余部分进行比较以进行重复? 例如,List fileNames包含“00012345.pdf”和“12345.pdf”,并被视为duplicte。标记此类副本的最佳策略是什么?
由于
更新:文件的命名仅限于数字。它们用零填充。重复是缺少填充的地方。因此,“123.pdf”& “000123.pdf”是重复的。
答案 0 :(得分:4)
您可能希望实现自己的子字符串比较器,以根据子字符串是否包含在另一个字符串中来测试相等性。
这不一定是优化的,但它会起作用。如果您使用的是.NET 4.0,也可以考虑使用Parallel Linq。
编辑:更新后回复以反映编辑后的精炼问题
void Main()
{
List<string> stringList = new List<string> { "00012345.pdf","12345.pdf","notaduplicate.jpg","3453456363234.jpg"};
IEqualityComparer<string> comparer = new NumericFilenameEqualityComparer ();
var duplicates = stringList.GroupBy (s => s, comparer).Where(grp => grp.Count() > 1);
// do something with grouped duplicates...
}
// Not safe for null's !
// NB do you own parameter / null checks / string-case options etc !
public class NumericFilenameEqualityComparer : IEqualityComparer<string> {
private static Regex digitFilenameRegex = new Regex(@"\d+", RegexOptions.Compiled);
public bool Equals(string left, string right) {
Match leftDigitsMatch = digitFilenameRegex.Match(left);
Match rightDigitsMatch = digitFilenameRegex.Match(right);
long leftValue = leftDigitsMatch.Success ? long.Parse(leftDigitsMatch.Value) : long.MaxValue;
long rightValue = rightDigitsMatch.Success ? long.Parse(rightDigitsMatch.Value) : long.MaxValue;
return leftValue == rightValue;
}
public int GetHashCode(string value) {
return base.GetHashCode();
}
}
答案 1 :(得分:1)
我知道您正在寻找重复项以便将其删除?
可以采用以下方法:
创建一个负责复制规则的类MyString
。也就是说,覆盖Equals
和GetHashCode
以重新创建您正在考虑的重复规则。 (我从你的问题中了解 00012345.pdf 和 12345.pdf 应该被视为重复?)
明确地或明确地将此类转换为string
(或覆盖ToString()
)。
创建一个HashCode<MyString>
,并在原始List<String>
检查重复项时重复填写。
可能很脏,但它会起作用。这里唯一的“硬”部分是正确实施复制规则。
答案 2 :(得分:0)
我有一个简单的解决方案,每个人都可以找到重复的字符串单词和汉字 对于文字
public class Test {
public static void main(String[] args) {
findDuplicateWords("i am am a a learner learner learner");
}
private static void findDuplicateWords(String string) {
HashMap<String,Integer> hm=new HashMap<>();
String[] s=string.split(" ");
for(String tempString:s){
if(hm.get(tempString)!=null){
hm.put(tempString, hm.get(tempString)+1);
}
else{
hm.put(tempString,1);
}
}
System.out.println(hm);
}
}
用于循环字符,获取数组长度并使用charAt()
答案 3 :(得分:-1)
也许是这样的:
List<string> theList = new List<string>() { "00012345.pdf", "00012345.pdf", "12345.pdf", "1234567.pdf", "12.pdf" };
theList.GroupBy(txt => txt)
.Where(grouping => grouping.Count() > 1)
.ToList()
.ForEach(groupItem => Console.WriteLine("{0} duplicated {1} times with these values {2}",
groupItem.Key,
groupItem.Count(),
string.Join(" ", groupItem.ToArray())));