Java:基于正则表达式在HashMap密钥中搜索?

Dan*_*rzo 14 java regex hashmap

我正在使用HashMap构建同义词库以存储同义词.

我正在尝试基于正则表达式搜索单词:该方法必须将字符串作为参数并返回结果数组.这是我的第一次尝试:

public ArrayList<String> searchDefinition(String regex) {
    ArrayList<String> results = new ArrayList<String>();

    Pattern p = Pattern.compile(regex);

    Set<String> keys = thesaurus.keySet();
    Iterator<String> ite = keys.iterator();

    while (ite.hasNext()) {
        String candidate = ite.next();
        Matcher m = p.matcher(candidate);
        System.out.println("Attempting to match: " + candidate + " to "  + regex);
        if (m.matches()) {
            System.out.println("it matches");
            results.add(candidate);
        }
    }   

    if (results.isEmpty()) {
        return null;
    }
    else {
        return results;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这不会像我期望的那样工作(或者我可能错误地使用正则表达式).如果我在hashmap中有以下键:

cat, car, chopper
Run Code Online (Sandbox Code Playgroud)

然后通过电话searchDefinition("c")searchDefinition("c*")我得到null.

  1. 如何按预期工作?
  2. 是否有比HashMap更好的数据结构来保持graph叙词表所需的数据?(只有好奇心,对于这个任务我们被要求使用Java Collection Map).
  3. 还有其他我在上面的代码中做的不合适吗?

谢谢,丹

编辑:我已经纠正了这个例子.即使我使用正确的情况,它也不起作用.

Cli*_*int 10

您需要指定不区分大小写的Pattern.compile ( "c",Pattern.CASE_INSENSITIVE ).要查找包含其中的单词,c您需要使用matcher.find().Matcher.matches()尝试匹配整个字符串.


Jay*_*Jay 10

但是,嗯:

(a)如果您打算始终按顺序搜索HashMap,为什么还要使用HashMap?处理哈希键时会浪费很多浪费,而且当你从不使用哈希键时.当然,一个简单的ArrayList或LinkedList是一个更好的主意.

(b)这与词库有什么关系?为什么要使用正则表达式搜索同义词库?如果我想知道"cat"的同义词,我会认为我会搜索"cat",而不是"c.*".

我对如何构建词库的第一个想法是......好吧,我想我要问的第一个问题是,"同义词是一个等同关系吗?",即如果A是B的同义词,它是否遵循B是A的同义词?如果A是B的同义词而B是C的同义词,那么A是C的同义词吗?假设这些问题的答案是"是",那么我们想要构建的是将语言中的所有单词划分为同义词集合的东西,这样我们就可以将每个集合中的任何单词映射到该集合中的所有其他单词. .所以你需要的是一种获取任何单词的方法,将其映射到某种连接点,然后从该连接点转到映射到它的所有单词.

这在数据库上很简单:只需创建一个包含两列的表,比如"word"和"token",每个列都有自己的索引.所有同义词都映射到同一个令牌.令牌可以是任何东西,只要它对于任何给定的同义词集合是唯一的,例如序列号.然后搜索给定的单词,找到关联的标记,然后获取具有该标记的所有单词.例如,我们可以使用(大,1),(大,1),(巨大,1),(猫,2),(猫,2)等创建记录.搜索"大"并获得1,然后搜索1,你会得到"大","大"和"巨人".

我不知道内置Java集合中的任何类都可以执行此操作.我能想到的最简单的方法是构建两个协调的哈希表:一个用于将单词映射到标记,另一个用于将标记映射到一个单词数组.所以表1可能有big-> 1,large-> 1,gigantic-> 1,cat-> 2,feline-> 2等.然后表2映射1 - > [big,large,gigantic],2-> [cat,feline]等.您在第一个表中查找将一个单词映射到一个标记,然后在第二个表中将该标记映射回一个单词列表.它是笨拙的,因为所有的数据都是冗余存储的,也许有更好的解决方案,但我并没有把它从头脑中解脱出来.(好吧,如果我们假设我们每次都会按顺序搜索整个单词列表会很容易,但是当列表变大时,性能会很糟糕.)