2013-04-24 53 views
0

我有一个相当复杂的方法,我需要实现相关的两套比较字符串的。所以请耐心等待,因为我试图用尽可能简单的方式来描述它。实现一个复杂的方法,当一个组与第三

我给代表的文件名字符串的一组A - 让我们说“ABC”,“DEF”和“GHI”。我必须从这些名称中为每个名称派生出一组“关联”的文件名称 - 让我们假设“abc”为“abc_123”,“abc_456”和“abc_789”; “def”的“def_123”,“def_456”和“def_789”;和“ghi”的“ghi_123”,“ghi_456”和“ghi_789”。我能做到这一点。但是,这些关联的文件名可能带有前缀或后缀,这些前缀或后缀是不可预知的字符串 - 因此“abc”的相关文件名实际上可能是“HELLOabc_123WORLD”,“FOOabc_456BAR”和“999abc_789000”。 (就正则表达式而言,这只是在我上面写的关联文件名的两侧加上*的问题)。简而言之,相关的文件名将如下所示:

*<original filename><other piece that I know>* 

其中星号表示任意数量的随机字符(可能为0)。

这是难题的第一部分。

接着,我考虑到我要比较的所述一组相关联的文件名(组B)的字符串的另一集合C。 (如果你想知道,我试图检查关联的文件是否在某个目录中,并且我有该目录中的文件名列表,设置C)。如果我发现集合C中某个文件的所有关联文件名,我可以继续检查集A中的文件。我必须检查集A中的每个文件名,并且如果集B中的所有关联文件名都是在集合C中发现,我可以从集合A

最后检查过该文件,我必须从没有打勾(所以我会回到什么,如果一切都被发现)设置返回的文件名。

我一直在努力想出一种方法来实现此方法。我想创建一个地图,将来自集A的文件名映射到包含与文件名,像这样有关的所有文件名列表的:

Key  Value 
abc  *abc_123*, *abc_456*, *abc_789* 
def  *def_123*, *def_456*, *def_789* 
ghi  *ghi_123*, *ghi_456*, *ghi_789* 

然后我可以遍历这个地图的元素,和的值元素,将它们与集合C中的字符串进行比较。如果在集合C中找到给定键的值(列表)的所有元素,我可以将该键标记在我的列表中。任何剩余的密钥将被退回。

这在我看来,像它应该工作,但撇开这为代码的实际机制一直对我来说非常具有挑战性的。所以,如果你能给我任何小小的建议或指引,让我的想法朝着正确的方向发展,我会非常感激。如果您想提供代码,我的实现语言将是Java。伪代码也是受欢迎的。

回答

0

我想你已经正确地找出了解决方案的一部分,以您的问题。您肯定需要一个Map,实际上您的问题归结为查找给定列表中的所有元素是否存在于C中的一组字符串中。我不确定哪些数据结构持有字符串的集合B或C.但我可以为休息提供了一个伪代码:

Initialize a HashMap<String, ArrayList> 
for each string in set B 
    if it matches the pattern *abc_* 
    if "abc" is already in the Map 
     get the value of this key in a temp list and append this string at the end of the list 
    else 
     add a new entry into the Map 

    //follow the same for the other patterns. 

for each entry in the Map 
    traverse the list of values 
    check if this value is present in the set C 
     if you reach the end of the list, 
     remove the entry from the Map 

这样,你留下了只在地图的钥匙,你需要返回。

0

我不是很肯定,如果我正确地理解你的问题,但是这是我的想象:

List<String> setCStrings = //your set C strings I guess... 
for(String aSetCString : setCStrings) { 
    String pattern = ".*" + filename + "_" + associatedFileName + ".*"; 
    if(aSetCString.matches(pattern)) { 
     // do what you want with this string that matches the filename and associated file name 
    } 
}