2013-04-12 3 views
1
import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.FileInputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.LinkedHashSet; 
import java.util.List; 
import java.util.Set; 

public class Test { 

    List<String> knownWordsArrayList = new ArrayList<String>(); 
    List<String> wordsArrayList = new ArrayList<String>(); 

    public void readKnownWordsFile() 
    { 
     try { 
      FileInputStream fstream2 = new FileInputStream("knownWords.txt"); 
      BufferedReader br2 = new BufferedReader(new InputStreamReader(fstream2)); 
      String strLine; 
      while ((strLine = br2.readLine()) != null) { 
       knownWordsArrayList.add(strLine); 
      } 
     } catch (Exception e) { 
     } 

    } 

    public void readFile() { 
     try { 
      FileInputStream fstream = new FileInputStream("newWords.txt"); 
      BufferedReader br = new BufferedReader(new InputStreamReader(fstream)); 
      String strLine; 
      String numberedLineRemoved = ""; 
      String strippedInput = ""; 
      String[] words; 
      String trimmedString = ""; 
      while ((strLine = br.readLine()) != null) { 
       numberedLineRemoved = numberedLine(strLine); 
       strippedInput = numberedLineRemoved.replaceAll("\\p{Punct}", ""); 
       if ((strippedInput.trim().length() != 0) || (!strippedInput.contains("")) || (strippedInput.contains(" "))) { 
        words = strippedInput.split("\\s+"); 
        for (int i = 0; i < words.length; i++) { 
         if (words[i].trim().length() != 0) { 
          wordsArrayList.add(words[i]); 
         } 
        } 
       } 
      } 

      for (int i = 0; i < knownWordsArrayList.size(); i++) { 
       wordsArrayList.add(knownWordsArrayList.get(i)); 
      } 
      HashSet h = new HashSet(wordsArrayList); 
      wordsArrayList.clear(); 
      wordsArrayList.addAll(h); 
      for (int i = 0; i < wordsArrayList.size(); i++) { 
       System.out.println(wordsArrayList.get(i)); 
      } 
      System.out.println(wordsArrayList.size()); 
      in.close(); 
     } catch (Exception e) {// Catch exception if any 
      System.err.println("Error: " + e.getMessage()); 
     } 
    } 

    public String numberedLine(String string) { 
     if (string.matches(".*\\d.*")) { 
      return ""; 
     } else { 
      return string; 
     } 
    } 

    public static void main(String[] args) { 
     Test test = new Test(); 
     test.readKnownWordsFile(); 
     test.readFile(); 

    } 

} 

Добавляем в файлWordsArrayList из файла. Затем я перехожу к другому файлу и помещаю слова в словаArrayList. Затем я делаю hashSet для удаления дублированных слов, но они все еще существуют. Например, «Mrs» находится в файле knownWordsArrayList, но когда я печатаю словаArrayList, я все еще вижу «Mrs». Я не понимаю, почему дублирующиеся слова не удаляются. Может ли это иметь отношение к набору символов?Дубликаты не удаляются

+0

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

ответ

3

Например, «Mrs» находится в известном словареArrayList, но когда я печатаю wordsArrayList, я все еще вижу «Mrs».

Ну да, было бы. Вы явно добавлять все значения от knownWordsArrayList до wordsArrayList:

for (int i = 0; i < knownWordsArrayList.size(); i++) { 
     wordsArrayList.add(knownWordsArrayList.get(i)); 
} 

Это не совсем ясно, что ваш код предназначен для ведения (использование операций целого сбора и улучшенный цикл помог бы с точки зрения ясности), но именно поэтому все в knownWordsArrayList также находится в wordsArrayList.

Важно отметить, что это утверждение:

Тогда я сделать HashSet, чтобы удалить дублированные слова

... просто означает, что каждый из слов будет присутствовать только один раз. Вот и все.

Я подозреваю, что вы должны удалить код я цитировал выше, и вместо того, чтобы сделать:

HashSet h = new HashSet(wordsArrayList); 
h.removeAll(knownWordsArrayList); 
wordsArrayList = new ArrayList<String>(h); 
+0

Да, я явно объединяю два списка, чтобы удалить дубликаты. После этого для цикла вы можете увидеть мой хэш, который должен удалить дубликаты, но это не так. –

+2

@NomanArain: Нет, не следует. Он должен убедиться, что каждое слово происходит только один раз. Поэтому, если вы начинаете со списком {A, B, B}, а затем создаете хэш-набор из этого, он будет иметь {A, B}. Я думаю, вы неправильно поняли, что делает HashSet. –

+0

Вы правы, только что поняли>< –

1
String[] arr = { "kitty", "mitty", "kitty" }; 
    Set<String> hs = new HashSet<String>(Arrays.asList(arr)); 
    System.out.println(Arrays.asList(arr)); 
    System.out.println(hs); 

и выход:

[kitty, mitty, kitty] 
[mitty, kitty] 

это то, что вы ожидали или нет?

+0

Эй, спасибо, но Джон Скит ответил на вопрос и помог устранить проблему. –