2012-04-07 47 views
0

所以我給了一組電子郵件,我應該閱讀它們,將它們存儲在一個數組中,刪除重複項並打印「剩菜」。我幾乎可以做到這一點,但刪除重複項後,當我打印剩菜時,它會打印額外的nullJava字符串循環陣列空

這是我的代碼。有人能指出我的修復方向嗎?

public class Duplicate { 
    public static void main(String [] args){ 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Enter file name: "); 
     String fileName = keyboard.nextLine(); 
     if(fileName.equals("")){ 
      System.out.println("Error: User did not specify a file name."); 
     } 
     else{Scanner inputStream = null; 

     try{inputStream = new Scanner(new File(fileName)); 
     } 
     catch(FileNotFoundException e){ 
      System.out.println("Error: "+ fileName + " does not exist."); 
      System.exit(0); 
     } 


     String [] address = new String[100]; 

     for(int i=0;inputStream.hasNextLine();i++){ 
      String email = inputStream.nextLine(); 
      address[i]=email.toLowerCase(); 
      //System.out.println(address[i]); 
     } 


     Set<String> mail = new HashSet<String>(Arrays.asList(address)); 

     for(String email:mail){ 
      System.out.println(email); 
     } 
+0

像早先的問題一樣,這聽起來像是作業。請務必使用'作業'標籤。 – Leigh 2012-04-08 02:48:30

回答

5

我假設您讀取的地址少於100個。數組地址中的其餘元素爲空。這是空值的原因。

ArrayList<String>更換固定尺寸數組:

List<String> address = new ArrayList<String>(); 
//... 
    address.add(email.toLowerCase()); 
    // ... 

還必須替換該組的結構:

Set<String> mail = new HashSet<String>(address); 
+0

這仍然允許我能夠讀取多達100個地址嗎?因爲它將被測試的隨機數量<100。 – 2012-04-07 20:04:18

+0

相當不雅:從一開始就使用'Set'並刪除複製到代碼 – Bohemian 2012-04-07 20:04:58

+0

是的。 Nosid是現貨,但不是使用Array/ArrayList,而是爲什麼不立即使用Set?在從流中讀取並將您的地址添加到集合之前,創建您的集合。 – 2012-04-07 20:06:38

3

您正在試圖讀取固定號碼[100]的元件從文件。

如果有更多的電子郵件,你會錯過一些,如果有少 - 你必須留下一些null S [其中Set將摺疊成一個單一的null

嘗試使用ArrayList代替陣列,或使用從第一位置一Set ..

+0

+1:從一開始就沒有理由不僅僅爲我們設置一個'Set'。 – unholysampler 2012-04-07 20:04:36

1
String [] address = new String[100]; 

變化對

SortedSet<String> address = new TreeSet<String>(); 

address[i]=email.toLowerCase(); 

變化

address.add(email.toLowerCase()); 
0

只是這樣做:

Set<String> addresses = new HashSet<String>(); // use a Set 

while (inputStream.hasNextLine()) { 
    addresses.add(inputStream.nextLine().toLowerCase()); // in-line unused variable 
} 

for (String email : mail) { 
    System.out.println(email); 
} 
0

有你的代碼的幾個問題。

  • 您使用掃描儀從文件中讀取,這是我很少看到,也從未做過的。 FileInputStream類更適合於此目的。

  • 您使用固定尺寸數組來存儲一個未知的號碼串

  • 的可以使用一個for循環的未知數目的循環迭代。這沒有錯,但一個while循環更合適。

  • 您可以從數組中創建一個新的HashSet。再次沒有錯,但爲什麼你沒有在你的循環中使用HashSet?你會避免使用索引。

我假設你是一個剛剛開始編程的人,他只是掀起一些代碼來自動執行一些你不想手動執行的操作。沒有錯,當然,在這種情況下,只需使用一個ArrayList,因爲所有的String對象,保證你的情況獨特反正:

public class Duplicate { 
public static void main(String [] args){ 

Scanner keyboard = new Scanner(System.in); 
System.out.println("Enter file name: "); 
String fileName = keyboard.nextLine(); 
if(fileName.equals("")){ 
    System.out.println("Error: User did not specify a file name."); 
} 
    else{Scanner inputStream = null; 

try{inputStream = new Scanner(new File(fileName)); 
} 
catch(FileNotFoundException e){ 
    System.out.println("Error: "+ fileName + " does not exist."); 
    System.exit(0); 
} 


ArrayList<String> addresses = new ArrayList<String>(); 

for(int i=0;inputStream.hasNextLine();i++){ 
    String email = inputStream.nextLine(); 
    address.add(email.toLowerCase()); 
    //System.out.println(email); 
} 

for(String email:addresses){ 
    System.out.println(email); 
} 

通過適當進口。請注意:只需很少的更改,仍然可以改進一些內容,請參閱上文。祝你好運!