2016-10-05 4 views
0

Я создаю программу, которая должна указывать, являются ли все слова из текстового файла уникальными или если существует дубликат с использованием HashSet. Если есть дубликат, единственным выходом должен быть «NOT_UNIQUE», и если дубликатов нет, выход должен быть «UNIQUE».Как получить только один вывод из цикла при тестировании HashSet

Я считаю, что способ сделать это - добавить слова из файла в HashSet, и если слово не может быть добавлено, это потому, что это слово является дубликатом. Я уже начал создавать программу, но программа выводит «UNIQUE» для каждого слова, а не только один раз в конце программы. Я думаю, что это связано с моим использованием while-loop и 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"); 
     } 
    } 
} 

ответ

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

    } 
} 

Не забудьте закрыть свой дескриптор файла, если поместить это в приложение.

+0

Хотя ваш ответ более эффективен, чем у Бергера - теперь он удален, он не закрывает потоки (обратите внимание, что OP тоже не потрудился). – Mena

1

Вы печатаете ваши UNIQUE или NOT_UNIQUE выходы в цикле, пока ваш BufferedReader готов быть считаны на каждой линии чтения, поэтому он будет печатать значение для каждой строки, которая была считана ,

Возможно, вы захотите реорганизовать свой дизайн здесь. Приведенная ниже логика применяется только в том случае, если вы хотите, чтобы все данные считывались из файла, иначе будут более эффективные решения (см. Max Mammel).

  • Читать все строки из файла
  • хранить их в List (позволяет дубликаты)
  • Когда закончите читать, инициализировать новый Set передавая ваш List в его конструкторе (который будет обрезать его в набор уникальных String s)
  • Затем сравните размеры обоих - если они разные, у вас есть неповторимые предметы
  • Не по теме: не забудьте закрыть свои потоки!
+0

Благодарим за помощь. –

+0

@Alex добро пожаловать! – Mena

+0

Что касается не по теме, что значит закрыть мои потоки? –