【问题标题】:How can I parse through a file for a string matching a generated string?如何通过文件解析与生成的字符串匹配的字符串?
【发布时间】:2014-04-16 17:15:50
【问题描述】:

我的标题不好,我通常不擅长制作这些。

我有一个程序,它将生成输入单词的所有排列,并且应该检查这些是否是单词(检查字典),并输出那些是单词。真的,我只需要最后一部分,我不知道如何解析文件。

我取出了那里的东西(现在显示“String words =”),因为它确实让事情变得更糟(是一个 if 语句)。现在,它所要做的就是输出所有排列。

编辑:我应该补充一点,当我尝试将文件转入列表时添加了 try/catch(与它当前所处的字符串格式相反)。所以现在它什么都不做。 还有一件事:是否有可能(以及如何,真的)让排列显示字符少于输入的排列?很抱歉措辞不好,比如如果我输入五个字符,则显示所有五个字符排列,以及四个、三个、两个和一个。

import java.util.List;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.io.IOException;
import org.apache.commons.io.FileUtils;
import static java.lang.System.out;

public class Permutations
{
  public static void main(String[] args) throws Exception
  {
    out.println("Enter anything to get permutations: ");
    Scanner scan = new Scanner(System.in);
    String io = scan.nextLine();
    String str = io;
    StringBuffer strBuf = new StringBuffer(str);
    mutate(strBuf,str.length());
  }

  private static void mutate(StringBuffer str, int index)
  {
    try
    {
      String words = FileUtils.readFileToString(new File("wordsEn.txt"));

      if(index <= 0)
      {
        out.println(str);
      }

      else
      {
        mutate(str, index - 1);
        int currLoc = str.length()-index;
        for (int i = currLoc + 1; i < str.length(); i++)
        {
          change(str, currLoc, i);
          mutate(str, index - 1);
          change(str, i, currLoc);
        }
      }
    }
    catch(IOException e)
    {
      out.println("Your search found no results");
    }
  }
  private  static void change(StringBuffer str, int loc1, int loc2)
  {
    char t1 = str.charAt(loc1);
    str.setCharAt(loc1, str.charAt(loc2));
    str.setCharAt(loc2, t1);
  }
} 

【问题讨论】:

  • 你的字典是什么格式的?
  • @mok 文本文件 - 如果这就是你的意思。
  • 如果您的字典不是太大,您可以阅读文件并将单词放入某种数据结构中并以这种方式检查。
  • @JN11 它有大约 100,000 个单词,所以我认为它太大了。

标签: java file


【解决方案1】:

如果文件中的每个单词实际上都在不同的行,也许你可以试试这个:

BufferedReader br = new BufferedReader(new FileReader(file));  
String line = null;  
while ((line = br.readLine()) != null)  
{  
    ... // check and print here
} 

或者,如果您想尝试其他方法,Apache Commons IO 库有一个名为 LineIterator 的东西。

Reader 中行的迭代器。 LineIterator 持有对打开的 Reader 的引用。完成迭代器后,您应该关闭阅读器以释放内部资源。这可以通过直接关闭阅读器来完成,也可以通过在迭代器上调用 close() 或 closeQuietly(LineIterator) 方法来完成。

推荐的使用模式是:

LineIterator it = FileUtils.lineIterator(file, "UTF-8");
    try {
        while (it.hasNext()) {
            String line = it.nextLine();
            // do something with line
        }
    } finally {
        it.close();
}

【讨论】:

  • RE:您对速度的编辑,这个问题可能很有趣:stackoverflow.com/q/22955178/1267663
  • @JN11 啊,对不起。我得走了一会儿。它应该可以工作,但是到目前为止我尝试检查和打印的所有方法都不起作用。
猜你喜欢
  • 2014-10-12
  • 1970-01-01
  • 2018-01-01
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多