检查java中单词的文本文件中是否包含字符串

检查java中单词的文本文件中是否包含字符串,java,arraylist,io,string-comparison,Java,Arraylist,Io,String Comparison,我有一个来自github项目的文本文件(所有有效英语单词的集合),如下所示 我的文本文件位于我的项目中的resources文件夹下 我还有一个从mysql中的表中获取的行列表。 我想做的是检查每一行中的所有单词是否都是有效的英语单词,这就是为什么我将每一行与文件中包含的单词进行比较 这就是我迄今为止所尝试的: public static void englishCheck(List<String> rows) throws IOException { ClassLoader

我有一个来自github项目的文本文件(所有有效英语单词的集合),如下所示

我的文本文件位于我的项目中的
resources
文件夹下

我还有一个从mysql中的表中获取的行列表。 我想做的是检查每一行中的所有单词是否都是有效的英语单词,这就是为什么我将每一行与文件中包含的单词进行比较

这就是我迄今为止所尝试的:

 public static void englishCheck(List<String> rows) throws IOException {
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    int lenght, occurancy = 0;
    for ( String row : rows ){

       File file = new File(classLoader.getResource("words.txt").getFile());


       lenght = 0;

       if ( !row.isEmpty()  ){
           System.out.println("the row : "+row);
           String[] tokens = row.split("\\W+");
           lenght = tokens.length;
           for (String token : tokens) {

               occurancy = 0;
               BufferedReader br = new BufferedReader(new FileReader(file));

               String line;
               while ((line = br.readLine()) != null ){


                   if ((line.trim().toLowerCase()).equals(token.trim().toLowerCase())){
                       occurancy ++ ;

                   }
                   if (occurancy == lenght ){ System.out.println(" this is english "+row);break;}

               }

           }





       }

   }
}
publicstaticvoidenglishcheck(列表行)抛出IOException{
ClassLoader ClassLoader=ClassLoader.getSystemClassLoader();
内部长度,发生率=0;
用于(字符串行:行){
File File=新文件(classLoader.getResource(“words.txt”).getFile();
长度=0;
如果(!row.isEmpty()){
System.out.println(“行:“+row”);
字符串[]标记=行分割(\\W+);
lenght=代币。长度;
for(字符串标记:标记){
发生率=0;
BufferedReader br=新的BufferedReader(新文件读取器(文件));
弦线;
而((line=br.readLine())!=null){
if((line.trim().toLowerCase()).equals(token.trim().toLowerCase())){
发生率++;
}
if(occurancy==lenght){System.out.println(“这是英语”+行);break;}
}
}
}
}
}
这只适用于最开始的行,之后我的方法只在显示它们的行上循环并忽略比较,我想知道为什么这不适用于我的行集,如果我像这样预定义我的列表,它也可以工作
list raws=Arrays.asList(raw1,raw2,raw3)
等等您可以使用该方法

如果此列表包含 指定的集合

假设您同时拥有列表fledMyListFromResourcesMyListFromResources,则可以执行以下操作:

List<String> myListFromRessources = Arrays.asList("A", "B", "C", "D");
List<String> myListFromRessources = Arrays.asList("D", "B");

boolean myInter = myListFromRessources.containsAll(myListFromSQL);
System.out.println(myInter);
myListFromSQL = Arrays.asList("D", "B", "Y");
myInter = myListFromRessources.containsAll(myListFromSQL);
System.out.println(myInter);
List myListFromResources=Arrays.asList(“A”、“B”、“C”、“D”);
List myListFromResources=Arrays.asList(“D”、“B”);
布尔值myInter=myListFromResources.containsAll(myListFromSQL);
System.out.println(myInter);
myListFromSQL=Arrays.asList(“D”、“B”、“Y”);
myInter=MyListFromResources.containsAll(myListFromSQL);
System.out.println(myInter);

您可以读取
words.txt
文件,将单词转换成小写,然后将单词放入
哈希集

使用
布尔包含(对象o)
布尔包含(集合c)比较每个单词的方法。
时间为O(n)

提示:不要在每个循环中读取文件。读取文件的速度非常慢。

ClassLoader ClassLoader=ClassLoader.getSystemClassLoader();
InputStream InputStream=classLoader.getResourceAsStream(“words.txt”);
BufferedReader reader=新的BufferedReader(新的InputStreamReader(inputStream));
List wordList=新建LinkedList();//你不知道字数,LinkedList是一个更好的方法。
字符串行=null;
而((line=reader.readLine())!=null){
String[]words=line.toLowerCase().split(\\W+);
addAll(Arrays.asList(words));
}
Set wordSet=newhashset(wordList.size());
addAll(单词列表);
//然后您可以使用单词集进行检查。
//你应该把代币转换成小写。
String[]tokens=row.toLowerCase().split(\\W+);
containsAll(Arrays.asList(tokens));

您的代码不起作用的原因是
发生率
不能是0或1以外的任何值。通过遵循逻辑或通过调试器可以看到这一点

如果words.txt文件不太大,并且有足够的可用RAM,则可以通过在开始时将words.txt文件读入内存来加快处理速度。此外,您只需要调用toLowerCase()一次,而不是每次比较。但是,要注意区域设置。只要您没有任何非英语字符,如德语eszett或希腊语sigma,以下代码就可以工作

public static void englishCheck(List<String> rows) throws IOException {
    final URI wordsUri;
    try {
        wordsUri = ClassLoader.getSystemResource("words.txt").toURI();
    } catch (URISyntaxException e) {
        throw new AssertionError(e); // can never happen
    }

    final Set<String> words = Files.lines(Paths.get(wordsUri))
            .map(String::toLowerCase)
            .collect(Collectors.toSet());

    for (String row: rows)
        if (!row.isEmpty()) {
            System.out.println("the row : " + row);
            String[] tokens = row.toLowerCase().split("\\W+");
            if (words.containsAll(Arrays.asList(tokens)))
                System.out.println(" this is english " + row);
        }
}
publicstaticvoidenglishcheck(列表行)抛出IOException{
最终URI wordsUri;
试一试{
wordsUri=ClassLoader.getSystemResource(“words.txt”).toURI();
}捕获(URISyntaxException e){
抛出新断言错误(e);//永远不会发生
}
最终设置单词=Files.lines(path.get(wordsUri))
.map(字符串::toLowerCase)
.collect(收集器.toSet());
用于(字符串行:行)
如果(!row.isEmpty()){
System.out.println(“行:“+row”);
String[]tokens=row.toLowerCase().split(\\W+);
if(words.containsAll(Arrays.asList(令牌)))
System.out.println(“这是英语”+行);
}
}

超级坏主意:在这里创建一个n*m双循环。您绝对不想一次又一次地读取每个单词的文件。@DevRj/words.txt中的数据格式是什么??这是一行一行的,在同一行中,给出一个示例提示:当您编辑源代码时。。。请确保格式正确。@GhostCat也许这是个坏主意,也许您可以提供一种方法来验证行中的每个单词是否都包含在该文件中,以及一种方法来立即将该文件读入内存,因为这是您的建议。谢谢你,你还想补充一点,也许可以立即将该文件读入内存。不是真的,这就是为什么我写道:“假设两个列表都已填写”。。。我假设OP知道怎么做,因为他在代码中没有提到任何关于它的问题……我的文件是从github项目下载的一组英文单词,我不清楚我的SQL表包含什么,它可能包含一些无意义的单词(
row=“ghsjgsdh hg.hg”
)或半个英文单词row=“半有效英语句子hkdojgsv hdh”)或有效的一行=“有效英语句子
public static void englishCheck(List<String> rows) throws IOException {
    final URI wordsUri;
    try {
        wordsUri = ClassLoader.getSystemResource("words.txt").toURI();
    } catch (URISyntaxException e) {
        throw new AssertionError(e); // can never happen
    }

    final Set<String> words = Files.lines(Paths.get(wordsUri))
            .map(String::toLowerCase)
            .collect(Collectors.toSet());

    for (String row: rows)
        if (!row.isEmpty()) {
            System.out.println("the row : " + row);
            String[] tokens = row.toLowerCase().split("\\W+");
            if (words.containsAll(Arrays.asList(tokens)))
                System.out.println(" this is english " + row);
        }
}