2010-08-01 2 views
0

Я пытаюсь прочитать строку текста из текстового файла и поместить каждую строку в карту, чтобы я мог удалять повторяющиеся слова (например, тестовый тест) и печатать строки без дубликатов слов , Я должен делать что-то неправильно, потому что я в основном получаю только одну строку в качестве моего ключа, а каждую строку читают по одному. Есть предположения? Благодарю.Java + readLine с BufferedReader

public DeleteDup(File f) throws IOException { 

    line = new HashMap<String, Integer>(); 
    try { 
     BufferedReader in = new BufferedReader(new FileReader(f)); 
     Integer lineCount = 0; 
     for (String s = null; (s = in.readLine()) != null;) { 
      line.put(s, lineCount); 
      lineCount++; 
      System.out.println("s: " + s); 
     } 
    } 
    catch(IOException e) { 
     e.printStackTrace(); 
    } 
    this.deleteDuplicates(line); 
} 
private Map<String, Integer> line; 
+0

Если вы вставляете код в свой вопрос, проверьте правильность его форматирования. Вкладки в оригинале сбросили отступ. – JeremyP

ответ

3

Честно говоря, ваш вопрос не особенно понятно - не понятно, почему вы получили lineCount, или что deleteDuplicates будет делать, или почему вы назвали line переменную таким образом, когда это не на самом деле строка - это карта от строк до последнего номера строки, на котором появилась эта строка.

Если вам не нужны номера строк, вместо этого я бы использовал Set<String>.

Однако все это в стороне, если смотреть на keySet из line после этого, он будет быть все линии. Это предполагает, что текстовый файл действительно используется в кодировке по умолчанию для вашей системы (что, к сожалению, использует FileReader, я обычно использую InputStreamReader и явно указываю кодировку).

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

1

Ваш вопрос не очень ясен.

Но, просматривая фрагмент кода, я думаю, вы пытались удалить повторяющиеся слова в каждой строке.

Этот фрагмент кода может быть полезен.

public class StackOverflow { 

    public static void main(String[] args) throws IOException { 
     List<Set<String>> unique = new ArrayList<Set<String>>(); 

     BufferedReader reader = new BufferedReader(
       new FileReader("C:\\temp\\testfile.txt")); 

     String line =null; 
     while((line = reader.readLine()) != null){ 

      String[] stringArr = line.split("\\s+"); 
      Set<String> strSet = new HashSet<String>(); 
      for(String tmpStr : stringArr){ 
       strSet.add(tmpStr); 
      } 
      unique.add(strSet); 
     }  
    } 
} 
0

Только проблема с кодом, который я вижу, это то, что у DeleteDup нет указанного типа возврата. В противном случае код отлично выглядит и корректно читается из файла.

Просьба удалить код и файл метода deleteDuplicates.

1

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

public void deleteDup(File f) 
    { 
     try 
     { 
      BufferedReader in = new BufferedReader(new FileReader(f)); 
      Integer wordCount = 0; 
      boolean isDuplicate = false; 
      String [] arr = null; 
      for (String line = null; (line = in.readLine()) != null;) 
      { 
       isDuplicate = false; 
       wordCount = 0; 
       wordMap.clear(); 

       arr = line.split("\\s+"); 
       for(String word : arr) 
       { 
        wordCount = wordMap.get(word); 
        if(null == wordCount) 
        { 
         wordCount = 1; 
        } 
        else 
        { 
         wordCount++; 
         isDuplicate = true; 
         break; 
        } 
        wordMap.put(word, wordCount); 
       } 
       if(!isDuplicate) 
       { 
        lines.add(line); 
       } 
      } 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    private Map<String, Integer> wordMap = new HashMap<String, Integer>(); 
    private List<String> lines = new ArrayList<String>(); 

В этом фрагменте линии будет содержать строки, которые не имеют повторяющиеся слова в нем. было бы легче найти вашу проблему, если мы знали, что

this.deleteDuplicates(line); 

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

0
  1. Вы печатаете каждую прочитанную строку, а не только уникальные строки.
  2. Ваш метод deleteDuplicateLines() ничего не сделает, поскольку в HashMap никогда не будет дубликатов.

Так что совсем не ясно, какова ваша фактическая проблема.