当前位置: 首页 > 知识库问答 >
问题:

在Java中非常大的集合或列表中搜索与regex匹配的字符串

隆长卿
2023-03-14

我的所有单词的文件大约是60MB,搜索押韵现在需要大约几分钟。

SELECT *
FROM table 
WHERE word LIKE '%rhyme'

多谢帮忙!

package pl.kamilkoszykowski.dopewriter;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.concurrent.*;

@RestController
@CrossOrigin("http://localhost:4200")
public class Controller {

    Set<String> dictionary = getDictionary(); // SET WITH WORDS

    @GetMapping("/rhyme/{word}")
    public Set<String> rhymes(@PathVariable String word) throws InterruptedException {

        String regex = "\\b[A-Za-z]*" + word + "\\b"; // RHYME TO SEARCH FOR IN DICTIONARY SET

        Set<String> rhymesList = new HashSet<>();

        int numRunnables = 64;
        BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(numRunnables, true);
        RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
        ExecutorService executor = new ThreadPoolExecutor(numRunnables, numRunnables, 0L, TimeUnit.MILLISECONDS, queue, handler);

        for (String a : dictionary) {
            executor.execute(new Runnable() {

                @Override
                public void run() {
                    if (a.matches(regex)) {
                        rhymesList.add(a);
                    }
                }
            });
        }

        executor.shutdown();
        while (executor.isTerminated() == false){
            Thread.sleep(50);
        }

        return rhymesList;
    }

    public Set<String> getDictionary() { // READING TXT FILE
        try {
            List<String> list = new ArrayList<>(List.of(Files.readString(Paths.get("src/main/resources/dictionary.txt")).split(",")));
            return new HashSet<>(list);
        } catch (IOException e) {
            return null;
        }
    }
}

共有1个答案

柴星津
2023-03-14

迭代集合本身是一个耗时的过程。多种解决方式:

  1. 使用java流。--与自定义线程池执行器相比,实现更快,速度更快。
  2. 保持数据的排序集。做一个排序技术以更快地得到结果。仍然不够快。
  3. 将数据存储在trie数据结构中,并获取与regex匹配的根下的所有单词。--推荐。
 类似资料:
  • 问题内容: 我认为我遇到了一个听起来比实际容易的问题……我不太确定。我想定义一个正则表达式,并且要构建一些与之匹配的字符串。 我可以导入具有该功能的任何模块吗?最好不要使用或暴力破解方法。必须有一种更优雅的方法来做到这一点。 问题答案: 我一直在研究一个小的帮助程序库,用于使用Python生成随机字符串 它包含一个方法,该方法允许您从正则表达式创建字符串: 目前,它适用于大多数基本正则表达式。

  • 我有一个正在测试的方法,它返回一个对象列表。。。例如“Person”对象。 我有一个“预期的最后名字”列表来验证结果。 我目前有一个工作测试,它循环遍历“expectedLastNames”中的名称,并断言每个名称都包含在“Person”对象列表中。与此类似(请注意,以下代码段位于Kotlin中): 当断言通过时,这非常有效,并验证了我的方法。然而,当测试失败时,这是非常麻烦的,因为一旦遇到缺少的

  • 本文向大家介绍在Java中搜索字符串中的字符。,包括了在Java中搜索字符串中的字符。的使用技巧和注意事项,需要的朋友参考一下 您可以使用String类的方法在字符串中搜索特定字母。此方法返回字符串中单词的位置索引(如果找到)。否则返回-1。 示例 输出结果

  • 问题内容: 我想编写一个SQL查询,该查询在文本字段中搜索关键字,但是仅当它是“全字匹配”时(例如,当我搜索“ rid”时,它不应该与“ arid”匹配,但是应该匹配“摆脱”。 我正在使用MySQL。 幸运的是,在该应用程序中性能并不是至关重要的,并且数据库大小和字符串大小都非常小,但是我更喜欢在SQL中而不是在PHP中驱动它。 问题答案: 您可以使用和和字边界标记: 2020年更新:(实际上是2

  • android room查询将如何匹配一列数据?数据是否完全匹配或以搜索字符串开头 这似乎只给了我确切的匹配 谢谢

  • 问题内容: 我试图在问题历史记录中找到问题的答案,但是当他们浏览了几十个我放弃的匹配答案后,它们又回到了一千多个。所以这是我的问题。 我希望能够找到字符串中正好六个数字的第一个序列。给定字符串“一些文本987654321和一些更多的文本123456,以及其他一些文本再次654321和最后的更多文本”,我想找到与123456序列匹配的正则表达式。 我是regex的新手,对它如何工作的简短解释会很有帮