【问题标题】:Implementing a complex method to compare two sets of Strings when groups of one are associated with a third当一组字符串与第三组相关联时,实现一个复杂的方法来比较两组字符串
【发布时间】:2013-04-24 02:54:00
【问题描述】:

我有一个相当复杂的方法需要实现。所以请耐心等待,我会尽量用简单的方式来描述它。

我得到了一组代表文件名的字符串——比如“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 映射到包含与该文件名关联的所有文件名的列表,如下所示:

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。也欢迎使用伪代码。

【问题讨论】:

    标签: java string map wildcard


    【解决方案1】:

    我不太确定我是否正确理解了您的问题,但这是我的想象:

    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
        }
    }
    

    【讨论】:

      【解决方案2】:

      我认为您已经正确地确定了部分解决您的问题的方法。您肯定需要一个 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 中需要返回的键。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-03
        相关资源
        最近更新 更多