2012-01-07 3 views
2

Здесь я написал код, который показывает повторяющиеся числа в текстовом файле. Здесь я предположил, что текстовый файл содержит только целые числа в каждой строке. Как вы теперь видите, он показывает повторяющиеся целые числа в текстовом файле.Идентификация повторяющихся номеров в текстовом файле с использованием набора хэшей

Я жестко закодировал путь к текстовому файлу.

Здесь я использовал два хеш-набора для его реализации. Могу ли я это сделать, используя только один набор хэшей? Можете ли вы рассказать мне, как реализовать то же самое, используя только один набор хэшей.?

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

общественного класса FileRead {

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    HashSet <String> uniquelines=new HashSet<String>(); 
    HashSet<String>duplicatelines=new HashSet<String>(); 


    try{ 
     FileInputStream fstream=new FileInputStream("C:/Users/LENOVO/Desktop/txt.txt"); 
     DataInputStream in=new DataInputStream(fstream); 
     BufferedReader br=new BufferedReader(new InputStreamReader(in)); 
     ArrayList arr=new ArrayList(); 
     String str; 
     while((str=br.readLine())!=null){ 
      if(uniquelines.contains(str)){ 
       if(!duplicatelines.contains(str)){ 
        duplicatelines.add(str); 
        System.out.println(str); 
       } 
      } 
      else{ 
       uniquelines.add(str); 
      } 
     } 
     in.close(); 
    }catch(Exception e){ 
     System.out.println(e); 
    } 

} 

} 
+0

не используйте подстановочные знаки (. *) для импорта. Импортируйте только классы, которые вам нужны для использования –

+0

Я не верю, что вы сможете использовать один хэшсет для определения повторяющихся строк. Как отметил @JB Nizet, вам нужно использовать хэш-таблицу. HashSet "не дает никаких гарантий относительно порядка итерации набора". но, если вы использовали сортировку, вы можете отсортировать коллекцию, а затем сравнить позицию + (позиция + 1), чтобы определить дубликаты. Это опять же не так грациозно, как использование HashMap. – XanderLynn

ответ

3

Чтобы сохранить существующую функциональность, я не понимаю, как вы можете использовать один HashSet. Однако вы могли бы использовать один HashMap, где ключ был бы строкой, а значением было бы количество вхождений строки в файл.

Боковые ноты:

  • потоки, читатели и писатели всегда должны быть закрыты в конце концов блока.
  • Ваша arr переменная не полезна.
+0

справедливая точка, но из сообщения OP неясно, что будет использоваться хэшсет, и поэтому трудно дать решение –

1

Вам не нужно проверять, содержит ли константы уже строку, просто добавьте ее в любом случае ... сам hashset выполнит проверку и не позволит дублировать. См. Код ниже ...

Если вам не нужно печатать дубликаты несколько раз, не один раз (возможно, вы печатаете его только для тестирования?), Вам не нужно устанавливать дубликаты в код ниже .... но если вы это сделаете, то нет никакого способа, вы можете сделать это без отслеживания того, что дублирует вы нашли раньше, так что да, вам потребуется два комплекта ...

public static void main(String[] args) { 
    HashSet <String> uniquelines=new HashSet<String>(); 
    Set <String> duplicates=new HashSet<String>(); 
    BufferedReader br = null; 
    try{ 
     FileInputStream fstream=new FileInputStream("C:/Users/LENOVO/Desktop/txt.txt"); 
     DataInputStream in=new DataInputStream(fstream); 
     br=new BufferedReader(new InputStreamReader(in)); 
     String str; 
     while((str=br.readLine())!=null){ 
      boolean duplicate = !uniquelines.add(str); 
      if (duplicate) { 
       if (!duplicates.contains(str)) { 
        System.out.println(str); 
        duplicates.add(str); 
       } 
      } 
     } 
    } catch(Exception e) { 
     System.out.println(e); 
    } finally { 
     try { 
      br.close(); 
     } catch(Exception e2) { } 
    } 

}