我有一个文本文件,每行都有一个单词或短语。如何:
- 把这些短语读到记忆中,
- 区分(消除重复),
- 按字母顺序排序,
- 将结果写回文件?
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." );