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

时间:2016-10-05 15:32:29

标签: java if-statement while-loop bufferedreader 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");
        }
    } 
}

2 个答案:

答案 0 :(得分:1)

UNIQUE准备好阅读时,在每行阅读时,您正在循环打印NOT_UNIQUEBufferedReader输出,因此它会打印一个值每一行都已被阅读。

你可能想在这里重构你的设计。 以下逻辑仅适用于您希望实际保留从文件中读取的整个数据的情况,否则会有更高效的解决方案(请参阅Max Mammel&#39; s)。

  • 阅读文件中的所有行
  • 将它们存储在List(允许重复)
  • 完成阅读后,初始化一个新的Set在其构造函数中传递List(将其修剪为一组唯一的String
  • 然后比较两者的大小 - 如果它们不同,则您有非独特的项目
  • 偏离主题:记得关闭你的溪流!

答案 1 :(得分:1)

标志不优雅,但在这种情况下,我认为这是一个实用的解决方案。如果你不希望它显示每个单词,你可以设置一个标志和保释:

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");

    } 
}

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