0

我有一个要求,只有当它不存在并且我需要寻找确切的模式时,我才必须将一些字符串模式添加到集合中。

例如,假设针对给定键,值是 abc,bcd,aefg 并且要添加的新模式是 efg 然后应该添加它(假设值以逗号分隔作为分隔符)

我计划使用StringBuffer.indexOf(String Str)方法但不使用它,因为如果要查找的模式作为值中的子字符串出现(在上述情况下,efg 已经作为子字符串出现),它将返回索引。我知道有一些使用 Java 5 的 Regex 功能的解决方案,但我需要稍微回顾一下这个主题。截至目前,我正在执行以下操作

  1. 遍历我对键的值(由分隔符分隔的值列表)
  2. 为新模式(要添加)做一个完全匹配,并且只有在它不存在时才添加它。

有没有更好的解决方案?

4

4 回答 4

0

除非我误解了你,否则 contains 方法应该可以解决问题吗?

str1.toLowerCase().contains(",efg,")

于 2013-09-12T16:49:13.590 回答
0

可以用一套吗?

String[] strings = myString.split(",");
Set<String> set;
//add strings to set

如果不:

String[] strings = myString.split(",");
List<String> list;
for (String s : strings) {
   if(!list.contains(s)) {
       list.add(s);
   }
}
于 2013-09-12T16:51:12.993 回答
0

集合接口本身有一个 contains 方法。如果您只想在集合尚未包含确切字符串的情况下添加,那么您可以使用它并避免自己迭代内容。collections contains 方法将对其内容使用“equals”方法:

http://docs.oracle.com/javase/6/docs/api/java/util/Collection.html#contains(java.lang.Object)

于 2013-09-12T16:51:50.200 回答
0

你可以尝试这样的事情:

@Test
public void addString() {
    String target = "abc,bcd,aefg";
    String stringToAdd = "efg";

    System.out.println(target);

    if(! new HashSet<String>(Arrays.asList(target.split(","))).contains(stringToAdd)) {
        target += "," + stringToAdd;
    }
    System.out.println(target);

    if(! new HashSet<String>(Arrays.asList(target.split(","))).contains(stringToAdd)) {
        target += "," + stringToAdd;
    }
    System.out.println(target);
}

输出

abc,bcd,aefg
abc,bcd,aefg,efg
abc,bcd,aefg,efg

代码如下:

  1. 拆分使用,
  2. 通过将数组转换为列表并将其提供给HasSet 的构造函数来生成一组结果数组
  3. 使用 Set 的方法contains检查要添加的字符串是否存在
  4. 如果不存在则添加

编辑

您可以尝试使用此正则表达式^efg|^efg,.+|.+,efg,.+|.+,efg$

@Test
public void addStringRegEx() {
    String target = "abc,bcd,aefg";
    String stringToAdd = "efg";

    String regex =
            // string is alone at first position and there is no comma
            "^" + stringToAdd + 
            "|" +  // OR
            // string is first and is followed by a comma and some other strings
            "^" + stringToAdd + ",.+" +   
            "|" +   // OR
            // string is enclosed within two commas i.e. in the middle
            ".+," + stringToAdd + ",.+" +
            "|" +   // OR
            // string is at the end and there are some strings and comma before it
            ".+," + stringToAdd + "$";

    Assert.assertFalse("aefg".matches(regex));
    Assert.assertFalse(",efg".matches(regex));
    Assert.assertFalse("efg,".matches(regex));
    Assert.assertFalse(",efg,".matches(regex));

    Assert.assertTrue("efg".matches(regex));
    Assert.assertTrue("foo,efg".matches(regex));
    Assert.assertTrue("foo,efg,bar".matches(regex));
    Assert.assertTrue("efg,bar".matches(regex));


    if(! target.matches(regex)) {
        target += "," + stringToAdd;
    }
    Assert.assertEquals("abc,bcd,aefg,efg", target);

    if(! target.matches(regex)) {
        target += "," + stringToAdd;
    }
    Assert.assertEquals("abc,bcd,aefg,efg", target);
}
于 2013-09-12T17:06:37.397 回答