测试 HashSet 时如何只从循环中获取一个输出

How to only get one output from a loop when testing a HashSet

我正在构建一个程序,该程序应该使用 HashSet 判断文本文件中的单词列表是否都是唯一的,或者是否存在重复项。如果有重复,则唯一的输出应该是 "NOT_UNIQUE",如果没有重复,输出应该是 "UNIQUE"。

我认为这样做的方法是将文件中的单词添加到 HashSet,如果无法添加单词,那是因为该单词重复。我已经开始构建程序,但是程序输出每个单词 "UNIQUE" 而不是在程序结束时只输出一次。我认为这与我使用 while 循环和 infile.readLine() 有关,但我不确定在这里还能做什么。谢谢您的帮助。我的代码如下:

import java.io.*;
import java.util.*;

public class Lab5
{
    public static void main (String[] args) throws Exception
    {
        HashSet<String> set = new HashSet<String>();
        BufferedReader infile = new BufferedReader( new FileReader( args[0] ) );
        while ( infile.ready() ) 
        {
            String word = infile.readLine();
            if ( !set.add(word) )
                System.out.println("NOT_UNIQUE \n");
            else
                System.out.println("UNIQUE \n");
        }
    } 
}

您正在循环打印 UNIQUENOT_UNIQUE 输出,同时您的 BufferedReader 已准备好被读取,在读取的每一行,它会打印一个值已阅读的每一行。

您可能想在这里重构您的设计。 下面的逻辑仅适用于您想要实际保留从文件中读取的全部数据的情况,否则会有更有效的解决方案(请参阅 Max Mammel)。

  • 读取文件中的所有行
  • 将它们存储在 List 中(允许重复)
  • 完成阅读后,初始化一个新的 Set,在其构造函数中传递您的 List(这将 trim 将其变成一组唯一的 String
  • 然后比较两者的尺寸 - 如果它们不同,则您的商品不独特
  • 题外话:记得关掉直播!

标志并不优雅,但在这种情况下,我认为这是一个务实的解决方案。如果您不希望它为每个单词显示,您可以设置一个标志并退出循环:

import java.io.*;
import java.util.*;

public class Lab5
{
    public static void main (String[] args) throws Exception
    {
        boolean isUnique = true;
        HashSet<String> set = new HashSet<String>();
        BufferedReader infile = new BufferedReader( new FileReader( args[0] ) );
        while ( infile.ready() ) 
        {
            String word = infile.readLine();
            if ( !set.add(word) ) {
                isUnique = false;
                break;
            }
        }

        System.out.println(isUnique ? "UNIQUE \n" : "NOT_UNIQUE \n");

    } 
}

如果将其放入应用程序,请记住关闭文件描述符。