2010-08-01 108 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 2010-08-01 09:08:40

回答

3

说实话,你的问题还不是特别清楚 - 这不是显而易见的,为什么你有lineCount,还是会做什么deleteDuplicates,或者为什么你命名为line变量的方法时,它不是实际上是一条线 - 它是从线条到该线条出现的最后一行号码的地图。

除非您需要行号,否则我会使用Set<String>

但是,除此之外,如果你看line之后的keySet,那么将是所有的行。这是假设文本文件是真正在您的系统的默认编码(这是什么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中永远不会有任何重复。

所以一点也不清楚你的实际问题是什么。

相关问题