【问题标题】:Overriding HashSet's Contains Method覆盖 HashSet 的 Contains 方法
【发布时间】:2010-01-06 18:52:14
【问题描述】:

谁能告诉我如何覆盖 HashSet 的 contains() 方法以使用正则表达式匹配而不是仅使用 equals()?

或者如果不是覆盖,我如何添加一个方法来使用正则表达式模式?基本上,我希望能够在包含字符串的 HashSet 上运行正则表达式,并且我需要使用正则表达式匹配子字符串。

如果我的方法不合适,请推荐其他人。

谢谢。 :)

【问题讨论】:

    标签: java collections hashset


    【解决方案1】:

    您可以通过以下方式扩展 HashSet:

    public class RegExHashSet extends HashSet<String > {
        public boolean containsRegEx( String regex ) {
            for( String string : this ) {
                if( string.matches( regex ) ) {
                    return true;
                }
            }
            return false;
        }
    }
    

    然后就可以使用了:

    RegExHashSet set = new RegExHashSet();
    set.add( "hello" );
    set.add( "my" );
    set.add( "name" );
    set.add( "is" );
    set.add( "tangens" );
    
    if( set.containsRegEx( "tan.*" ) ) {
        System.out.println( "it works" );
    }
    

    【讨论】:

    • 能否给我一个完整的代码,关于如何扩展 HashSet,然后从扩展的类中初始化一个 HashSet?
    • 这是 O(n) 加上插入时散列的额外(无用)要求。假设实际的 .contains() 从未使用过,ArrayList 会更好。
    • 一个 ArrayList 将允许同一对象的多个实例。如果您使用 Set,您可能希望其中只有一个 on Object 实例。
    • 其实我需要 contains 值。但是,我需要它与正则表达式匹配,而不仅仅是 equals() 方法。另外,我只想要一个对象的实例。在这种情况下,我只想要其中每个 String 的一个实例。
    【解决方案2】:

    我建议使用Google Collections,尤其是Sets.filter 方法。比尝试对集合进行子类化要容易得多。

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2021-01-06
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多