2017-08-16 102 views
2

一个文本文件,我已经从GitHub的项目,看起来一个文本文件(所有有效的英语单词集合)这样words.txt检查一个字符串包含在单词中的Java

我的文本文件是下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;} 

       } 

      } 





     } 

    } 
} 

这只有在首先行,在那之后我的方法遍历行只显示他们忽略了对比,我想知道这是为什么不为我行集的工作,它的工作原理也是,如果我预先设定我的名单像这样List<String> raws = Arrays.asList(raw1, raw2, raw3)

+0

超级坏主意:你在这里创建一个n * m双循环。你绝对不会**一次又一次地为你的每一个单词读这个文件。 – GhostCat

+0

@DevRj /words.txt中数据的格式是什么?它是一行一行的在同一行,给一个样本 –

+0

提示:当你*编辑*你的源代码...确保正确格式化它。 – GhostCat

回答

1

您可以阅读words.txt文件,转换词成小写,然后坐言HashSet

使用boolean contains(Object o)boolean containsAll(Collection<?> c);方法来比较每个单词。 时间为O(n)

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

ClassLoader classLoader = ClassLoader.getSystemClassLoader(); 
InputStream inputStream = classLoader.getResourceAsStream("words.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
List<String> wordList = new LinkedList<String>(); // You do not know word count, LinkedList is a better way. 
String line = null; 
while ((line = reader.readLine()) != null) { 
    String[] words = line.toLowerCase().split("\\W+"); 
    wordList.addAll(Arrays.asList(words)); 
} 
Set<String> wordSet = new HashSet<String>(wordList.size()); 
wordSet.addAll(wordList); 


// then you can use the wordSet to check. 
// You shold convert the tokens to lower case. 
String[] tokens = row.toLowerCase().split("\\W+"); 
wordSet.containsAll(Arrays.asList(tokens)); 
+0

有用的答案就像你可以直接传递一些值,而不是'Set wordSet = new HashSet (wordList.size()); (wordList);''你可以简单地这样做:'设置 wordSet = new HashSet (wordList);',谢谢 – DevRj

+0

是的。你是对的。谢谢。 – diguage

2

您可以使用该方法List#containsAll(Collection)

如果此列表包含 指定集合的​​所有元素,则返回true。

让我们假设你有两个列表flled myListFromRessourcesmyListFromRessources那么你可以做:

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); 
+0

您还想添加一些关于可能立即将该文件读入内存的信息。 – GhostCat

+0

不是真的,这就是为什么我写道:***“让我们假设你有两个列表填充”*** ...我假设OP知道如何做,因为他没有在代码中提及任何问题... –

+0

我的文件是从github项目下载的一组英文单词,并且我对我的SQL表包含的内容没有清楚的认识,它可能包含一些无意义的单词('row =“ghsjgsdh hg.hg”'' )或半英语单词row =“半英语句子hkdojgsv hdh”)或有效的一行=“有效英语句子”',我似乎无法理解您的建议如何适合我的情况 – DevRj

1

您的代码不起作用的原因是occurancy不能超过0或1以外的任何其他你可以看到,按照逻辑或通过调试器去。

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

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); 
     } 
} 
相关问题