Спасибо всем!
Вот тестовый пакет с некоторыми решениями для других:
Я думаю, что я использую метод hasTag2, но, похоже, он не имеет большого значения ..
public class TagTest extends TestCase {
private TagContainer tc = new TagContainer("tag tag_,tag_2;_tag test_3");
public void testHasTag() {
test(true, "tag", "tag_", "tag_2", "_tag", "test_3", "TAG", "TEST_3", "TAG_");
test(false, "test", "_ta", "hello");
}
private void test(boolean result, String... tags) {
for (String tag : tags) {
assertEquals(result, tc.hasTag1(tag));
assertEquals(result, tc.hasTag2(tag));
assertEquals(result, tc.hasTag3(tag));
assertEquals(result, tc.hasTag4(tag));
}
}
class TagContainer {
private String tagData;
public TagContainer(String t) {
this.tagData = t;
}
public boolean hasTag1(String tag) {
String delimeters = " ,;"; // Valid delimiter chars
Pattern p = Pattern.compile("[" + delimeters + "]" + tag.toLowerCase() + "[" + delimeters + "]");
Matcher m = p.matcher(" " + tagData.toLowerCase() + " ");
return m.find();
}
public boolean hasTag2(String tag) {
String[] tags = tagData.toLowerCase().split("[\\s,;]+");
List<String> listOfTags = Arrays.asList(tags);
return listOfTags.contains(tag.toLowerCase());
}
public boolean hasTag3(String tag) {
Scanner scanner = new Scanner(tagData.toLowerCase()).useDelimiter(" |,|;");
while (scanner.hasNext()) {
if (scanner.next().equals(tag.toLowerCase())) {
return true;
}
}
return false;
}
public boolean hasTag4(String tag) {
String[] tests = tagData.toLowerCase().split(" |,|;");
Set<String> tags = new HashSet<String>();
Collections.addAll(tags, tests);
return tags.contains(tag.toLowerCase());
}
}
}
Спасибо!