2017-02-22 59 views
-1

我想開發一個程序,可以通過字符串進行排序並刪除重複項。我爲此使用嵌套循環。但是,當我運行我的代碼時,它只是重複幾遍。刪除帶有嵌套循環的重複項java

package q2; 

import java.util.Arrays; 

public class Q2 { 

public static void main(String[] args) { 
    String sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY"; 
    String lowercaseSentence; 
    lowercaseSentence = sentence.toLowerCase(); 
    String[] sentenceWords = lowercaseSentence.split(" "); 
    int LenghtofSentence = sentenceWords.length; 
    String[] unique = new String[LenghtofSentence]; 

    for (int i = 0; i <= LenghtofSentence; i++) { 
     //System.out.println(i); 
     for (int j = 0; j <= LenghtofSentence; j++) { 
      if (!sentenceWords[i].equals(unique)) { 
       unique[j] = sentenceWords[i]; 
       j++; 
      } else { 
       j++; 
      } 
     } 
    System.out.println(Arrays.toString(unique)); 
    } 
} 
} 

這是錯誤消息我得到:

[ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask] 
[not, null, not, null, not, null, not, null, not, null, not, null, not, null, not, null, not] 
[what, null, what, null, what, null, what, null, what, null, what, null, what, null, what, null, what] 
[your, null, your, null, your, null, your, null, your, null, your, null, your, null, your, null, your] 
[country, null, country, null, country, null, country, null, country, null, country, null, country, null, country, null, country] 
[can, null, can, null, can, null, can, null, can, null, can, null, can, null, can, null, can] 
[do, null, do, null, do, null, do, null, do, null, do, null, do, null, do, null, do] 
[for, null, for, null, for, null, for, null, for, null, for, null, for, null, for, null, for] 
[you, null, you, null, you, null, you, null, you, null, you, null, you, null, you, null, you] 
[ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask, null, ask] 
[what, null, what, null, what, null, what, null, what, null, what, null, what, null, what, null, what] 
[you, null, you, null, you, null, you, null, you, null, you, null, you, null, you, null, you] 
[can, null, can, null, can, null, can, null, can, null, can, null, can, null, can, null, can] 
[do, null, do, null, do, null, do, null, do, null, do, null, do, null, do, null, do] 
[for, null, for, null, for, null, for, null, for, null, for, null, for, null, for, null, for] 
[your, null, your, null, your, null, your, null, your, null, your, null, your, null, your, null, your] 
[country, null, country, null, country, null, country, null, country, null, country, null, country, null, country, null, country] 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 17 

我使用此NetBeans。任何幫助表示讚賞。 謝謝 Keir

+1

調試你的代碼。 – f1sh

+1

爲什麼不使用'Set'(例如'LinkedHashSet')? – Thomas

+5

當你像這樣編寫一個for循環時:for(int i = 0; i <= LenghtofSentence; i ++)'你要經過數組的末尾。它應該是'<'而不是'<='。 – khelwood

回答

-1
package test; 


import java.util.ArrayList; 

import java.util.Arrays; 


public class Test { 


     public static void main(String[] args) { 

      String sentence = "ASK NOT WHAT YOUR COUNTRY CAN DO FOR YOU ASK WHAT YOU CAN DO FOR YOUR COUNTRY"; 

      String lowercaseSentence; 

      lowercaseSentence = sentence.toLowerCase(); 

      String[] sentenceWords = lowercaseSentence.split(" "); 

      int LenghtofSentence = sentenceWords.length; 

      String[] uniqueString = new String[LenghtofSentence]; 

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

      int k=0; 
      for(int i=0;i<LenghtofSentence;i++) 
      { 
      if(!unique.contains(sentenceWords[i])) 
      { 
       unique.add(sentenceWords[i]); 
       k++; 
      } 
      } 
      for(int i=0;i<unique.size();i++) 
      { 
       uniqueString[i] = unique.get(i); 
       System.out.print(" "+uniqueString[i]); 
      } 
     } 
    } 
4

我不知道你爲什麼使用for循環,使它複雜。

它可以簡單地使用java中的Set來完成。 Set是一個不包含重複元素的集合。欲瞭解更多link

Set<String> mySet = new LinkedHashSet<String>(Arrays.asList(sentenceWords)); 

這將自動刪除重複項。您可以從Set拿回你的數組沒有重複如下:

String[] unique = myset.toArray(new String[myset.size()]); 

使用上面的代碼之前,還進口下列:

import java.util.Arrays; 
import java.util.LinkedHashSet; 
import java.util.Set; 

使用LinkedHashSet將保持在其中的話是數組中存在的順序。希望能幫助到你。

+1

使用'LinkedHashSet'來保存詞序。 –

+0

是的,會更新代碼。 – SachinSarawgi

0

給你的問題似乎是一個練習,我認爲我們不應該給你一個解決方案,而是一個解釋如何找到解決方案的建議。首先,如果您可以在練習中使用Java集合,那麼使用Set<String>會給您帶來改進,因爲它會檢查單詞是否重複,併爲您提供沒有重複的集合。

如果在練習中只能使用數組,則必須使用不同的解決方案。 我建議首先迭代unique數組以檢查是否有重複項,然後對unique數組進行排序。

另一方面,Netbeans允許您逐步執行您的代碼(如@ f1sh建議的那樣)。

0

首先,你的邏輯看起來不太完美。

ArrayIndexOutOfBound是因爲陣列的長度是一個數字在陣列&標定元件正如我所說的從0

開始,因爲陣列的錯誤索引unique & sentenceWords替換<=與在兩個環路<的發生之前你應該再次考慮你的邏輯,因爲它不完美。您可以使用以下技巧來實現您的目標。

用您的代碼替換下面的代碼以刪除重複項&排序數組..

String[] unique = Arrays.stream(sentenceWords) 
    .distinct().sorted().toArray(String[]::new); 

此語句陣列unique執行後包含按排序形式詞法順序陣列sentenceWords的不同的元素。有關更多詳細信息,請參閱javadocs。