2012-03-09 13 views
1

これまでにarray out of boundsに問題がありましたが、もう受信しません。私ArrayListを使用した場合Javaの単語を比較する

私の問題があり、それがプリントアウトされます:

aba, aba, abaa, abaxxa, runner, runner, runners, school, school, schooling, schools, tasker, tasker 

taskを除外し、run

私はこれをしばらく見てきましたが、私はそれを理解できません。どんな助けも素晴らしいだろう!

import java.io.*; 
import java.util.Collections; 
import java.util.List; 
import java.util.ArrayList; 


public class RootWords { 

    public static void main(String[] args) { 
     String Word; 

     List<String> xList = new ArrayList<String>(); 
    try{ 
     BufferedReader reader = new BufferedReader(new FileReader("Words.txt")); 
     while ((Word = reader.readLine()) != null) { 
     xList.add(Word); 
     } 
     } 
    catch (IOException ioe){ 
     System.out.println("Problem opening input file"); 
     } 


     String[] Words = new String[ xList.size() ]; 

     Collections.sort(xList); 
     xList.toArray(Words); 

     int c; 
     String roots = ""; 

     for(int i = 0; i < Words.length ; i++){ 
       c = root(Words[i],Words[i+1]); 

     if(c >= 3 || c <=5){ 
      roots = Words[i]; 
      System.out.printf("%s\n", roots); 

     while(Words[i].startsWith(roots)){ 
      System.out.printf("%s\n", Words[i]); 
      i++; 
     } 
    // i--; 
     } 
     } 
     } 
public static int root(String a, String b){ 
     int min; 

     if(a.length() < b.length()){ 
       min= a.length(); 
     } 
     else{ 
      min = b.length(); 
     } 
     //return min; 

     int i; 

     i = 0; 
     while (i < min) 
     { 
      if (a.charAt(i) == b.charAt(i)) 
      i++; 
     else break; 

    } 

    return i; 
    } 
} 

私が持っているコードで範囲外の配列を受け取ることはできません。完全なリストを印刷するのに問題があります。私はしばらくしてabaを走らせます。abaa tasker abaxa runnerをランニングランナーの学校に派遣していますが、それを印刷すると、aba aba abaa abaxaaランナーランナー学校学校学校の学校職員のタスク担当者になります。したがって、私は、タスクを逃すと、それはArrayIndexOutOfBounds例外がスローされますときi+1 = words.length

...ここにあるように思わ
for(int i = 0; i < Words.length ; i++){ 
       c = root(Words[i],Words[i+1]); 

答えて

0

を実行しています。

+0

の配列をソートするためのコンパレータ又は比較を使用 'iが(Words.length - 1)<'それを修正することになるが。 – Rakesh

+0

コメントをいただきありがとうございますが、私はそのコードでarraryindexoutofboundsを持っていないという質問で言いましたが、正しいルートワードを印刷するのに問題があります – helloman

0

例外がスローされる原因となる配列の長さよりも大きいインデックスで配列にアクセスしています。したがって、配列にアクセスする前にインデックスを確認する必要があります。以下は私の提案です。最後の繰り返し@上記のループで

import java.io.*; 
import java.util.Collections; 
import java.util.List; 
import java.util.ArrayList; 


public class RootWords { 

    public static void main(String[] args) { 
     String Word; 

     List<String> xList = new ArrayList<String>(); 
     try{ 
      BufferedReader reader = new BufferedReader(new FileReader("Words.txt")); 
      while ((Word = reader.readLine()) != null) { 
       xList.add(Word); 
      } 
     } 
     catch (IOException ioe){ 
      System.out.println("Problem opening input file"); 
     } 


     String[] Words = new String[ xList.size() ]; 

     Collections.sort(xList); 
     xList.toArray(Words); 

     int c; 
     String roots = ""; 


     for(int i = 0; i < Words.length; i++) 
     { 
      if (i+1 == Words.length) 
      { 
       break; 
      } 
      c = root(Words[i],Words[i+1]); 

      if (c >= 3 || c <=5) 
      { 
       roots = Words[i]; 
       System.out.printf("%s\n", roots); 

       while(i < Words.length && Words[i].startsWith(roots)) 
       { 
        System.out.printf("%s\n", Words[i]); 
        i++; 
       } 
       // i--; 
      } 
     } 

    } 
    public static int root(String a, String b){ 
     int min; 

     if(a.length() < b.length()){ 
      min= a.length(); 
     } 
     else{ 
      min = b.length(); 
     } 
     //return min; 

     int i; 

     i = 0; 
     while (i < min) 
     { 
      if (a.charAt(i) == b.charAt(i)) 
       i++; 
      else break; 

     } 

     return i; 


    } 
} 
0
for(int i = 0; i < Words.length ; i++){ 
      c = root(Words[i],Words[i+1]); 

それはあなたのコードで

c = root(Words[i],Words[i+1]); 

I + 1に行くArrayIndexOutOfBounds exception与えるので、私+ 1 = Words.lengthとarray index start form 0 toWords.length-1

私はあなたにベストを与えていません解決方法私はちょうどあなたが間違っていることを指しています..

 for (int i = 0; i < Words.length; i++) { 
     c = root(Words[i], Words[i + 1]); 

     if (c >= 3 || c <= 5) { 
      roots = Words[i]; 
      System.out.printf("%s\n", roots); 

      while (Words[i].startsWith(roots)) { 
       System.out.printf("%s\n", Words[i]); 
       if (i + 1 == Words.length|| !Words[i + 1].startsWith(roots)) /** 
what is going on there when Words[i].startsWith(roots) tells false so before 
that its increment your counter and in for loop it also increment ,So 2 consultative 
increment for **i** 
And 2nd Problem is when **i=Words.length-1** then i its also increment so that in 
next iteration **Words[i].startsWith(roots)); i=Words.length** thats why it throw 
exception ..*/  { 
          break; 
         } 
       i++; 
      } 
      // i--; 
     } 
    } 
} 
+0

私が持っているコードで配列を受け取りません完全なリストを印刷するのに問題があります。私は ランナー 学校 学校教育を実行している abaxaa ランナー をタスクABA 実行 学校 タスク ABAA タスカー が、その後、私はそれをプリントアウトABA ABA ABAA abaxaa ランナー ランナー ランナーとの間を取得します 学校 学校 学校教育 学校 タスク担当者 担当者。したがって、私は仕事を失い、走っています。 – helloman

+0

チェックコードを読んで2がなぜあなたの問題を言及しているのか理解してください。 –

+0

さて、ありがとう、私はそれを見ます – helloman

0

ループの条件を作るオブジェクト

関連する問題