2017-02-22 13 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)); 

のためにこれは自動的に重複を削除します。

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

また、コードの上に使用する前に、次のインポート:次のようにSetから重複することなく、あなたの配列を取り戻すことができた単語が配列に存在した順序を維持しますLinkedHashSetを使用して

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

。それが役に立てば幸い。

+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を参照してください。

関連する問題