0

我有一个相当复杂的方法需要实现。因此,请耐心等待我尝试以尽可能简单的方式来描述它。

我得到了一组代表文件名的字符串——比如“abc”、“def”和“ghi”。我必须从这些名称中为每个名称派生一组“关联”文件名 - 比如说“abc_123”、“abc_456”和“abc_789”代表“abc”;“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)。

这是第一块拼图。

接下来,我得到了另一组字符串 C,我将与一组关联文件名(组 B)进行比较。(如果您想知道,我正在尝试检查相关文件是否在某个目录中,并且我有该目录中的文件名列表,设置为 C)。如果我在集合 C 中找到某个文件的所有关联文件名,我可以继续从集合 A 中检查该文件。我必须检查集合 A 中的每个文件名,并且如果集合 B 中的所有关联文件名都是在集合 C 中找到,我可以从集合 A 中检查该文件。

最后,我必须返回未选中的集合 A 中的文件名(因此,如果找到所有内容,我将不返回任何内容)。

我一直在努力想出一种方法来实现这种方法。我想创建一个 Map ,它将文件名从集合 A 映射到包含与该文件名关联的所有文件名的 List ,如下所示:

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。伪代码也受到欢迎。

4

2 回答 2

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

这样,您只剩下 Map 中需要返回的键。

于 2013-04-24T04:58:14.877 回答
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
    }
}
于 2013-04-24T04:58:46.907 回答