在 Java 中从文件中读取单词/短语,区分并写出到另一个文件



我有一个文本文件,每行都有一个单词或短语。如何:

  • 把这些短语读到记忆中,
  • 区分(消除重复),
  • 按字母顺序排序,
  • 将结果写回文件?

StackOverflow有其他语言(如C,PHP,Python,Prolog和VB6)的类似问题的答案。但是我找不到Java。

您可以利用:

  • NIO (非阻塞 I/O) API(自 Java 7 起可用)
  • Streams API(从 Java 8 开始可用)

。要优雅地解决问题:

public static void main(String... args) {
  Path input = Paths.get("/Users/yourUser/yourInputFile.txt");
  Path output = Paths.get("/Users/yourUser/yourOutputFile.txt");
  try {
   List<String> words = getDistinctSortedWords(input);
   Files.write(output, words, UTF_8);
  } catch (IOException e) {
    //log error and/or warn user
  }
}
private static List<String> getDistinctSortedWords(Path path) throws IOException {
  try(Stream<String> lines = Files.lines(path, UTF_8)) {
    return lines.map(String::trim)
            .filter(s -> !s.isEmpty()) // If keyword is not empty, collect it.
            .distinct()
            .sorted()
            .collect(toList());
  }
}

注意:需要静态导入

import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.stream.Collectors.toList;

下面的 Java 8 示例代码应该会有所帮助。它既不坚固也不经过充分测试。它假设您的所有数据都可以轻松放入内存中。虽然不完美,但这个例子应该让你朝着正确的方向前进。

Java 集合框架(教程)定义了用于收集一组不同值的 Set 接口。作为该接口的实现,我们将使用 HashSet .

请注意,我们尝试修剪每行中的任何空格。不幸的是,String::trim方法并没有彻底做到这一点。在实际工作中,我会用调用更好的库进行修剪来替换该调用,例如 Google Guava。您可能希望删除所有非打印字符。

我们使用 isEmpty 方法测试每个字符串,以过滤掉任何没有任何字符的字符串。

下面的代码使用"试用资源"语法自动关闭任何打开的文件。

// Read file.
// For each line, trim string. 
// Add to Set to make collection of distinct values.
// Convert to List, and sort.
// Write back values to text file.
Set< String > set = new HashSet<>( );
String path = "/Users/yourUser/yourInputFile.txt";
File file = new File( path );
try ( BufferedReader br = new BufferedReader( new FileReader( file ) ) ) {
    String line;
    while ( ( line = br.readLine( ) ) != null ) {
        // Process the line.
        String keyword = line.trim( );
        if ( ! keyword.isEmpty( ) ) {  // If keyword is not empty, collect it.
            set.add( keyword );
        }
    }
} catch ( IOException e ) {
    e.printStackTrace( );
}

现在我们有了不同价值观的Set。要对它们进行排序,我们需要转换为 List .Collections类(注意"s")提供了一种静态方法,用于对实现Comparable的项目列表进行排序。

List< String > keywords = new ArrayList< String >( set );
Collections.sort( keywords );

让我们将该排序列表写入存储中的文件。

// Write to file. 
// Use Try-With-Resources to automatically close the file if opened.
try ( 
        FileWriter writer = new FileWriter( "/Users/yourUser/yourOutputFile.txt" ) ;
) {
    for ( String k : keywords ) {
        writer.write( k + "n" );  // You may want a different newline instead of the Unix-style LINE FEED hard-coded here with "n".
    }
} catch ( IOException e ) {
    e.printStackTrace( );
}

如果需要,可以在控制台上查看结果。

System.out.println( "Size: " + keywords.size( ) );
System.out.println( "keywords: " + keywords );
System.out.println( "Done." );

相关内容

  • 没有找到相关文章

最新更新