2017-01-28 5 views
-1

言い換えれば、配列は単語= {"a"、 "the"、 "if"、 "are"、 "it"、 "is"}であり、このような文字列{「テーブルはここにあります」、「書籍は販売されています」、「判読可能な場合」}が含まれています。配列のすべての単語をarrayListから削除したい。 予想される出力は、{"table here"、 "books sold"、 "readable"}のようにArrayListになります。java:ArrayListから単語を削除する<String>

私はこれまでのところ、これを試してみました:

public static void main(String[] args) { 
     String[] words = {"a","the","in","if","are","it","is"}; 
     List<String> wordList = new ArrayList<String>(Arrays.asList(words)); 
     String[] tArray = {"a table is here", "books are sold","if it is readable"}; 
     List<String> list = new ArrayList<String>(Arrays.asList(tArray)); 

     for (int i = 0; i < list.size(); i++) { 
      String[] tArrays = list.get(i).split(" "); 
      List<String> line = new ArrayList<String>(Arrays.asList(tArrays)); 
       for (int c = 0; c < wordList.size(); c++) { 
        if (wordList.get(c).equals(line.get(i))) { 
         line.remove(i); 
         i--; 
         break; 
        } 
       }//end for 
      list.set(i, String.join(" ", line)); 
     }//end for 
     for(String string : list) 
     { 
      System.out.println(string); 
     } 
    } 

が、期待される出力を与えていません。代わりに "java.lang.ArrayIndexOutOfBoundsException:-1"というエラーが返されます

+0

コードをデバッグしようとしましたが、どの行で例外が発生し、値が負になるのかをチェックしましたか? – dbf

+0

"line.size()"を使用して、 ""に基づいて分割したすべての単語を反復する計画。 – nullpointer

+0

@dbfおそらく "i--;"私はそれをデバッグしようとしました.. –

答えて

1

""に基づいて分割した後にすべての単語を反復するには、line.size()を使用する必要があります。

for (int i = 0; i < list.size(); i++) { 
     String[] tArrays = list.get(i).split(" "); 
     List<String> line = new ArrayList<>(Arrays.asList(tArrays)); 
     for (int c = 0; c < wordList.size(); c++) { 
      if (wordList.get(c).equals(line.get(i))) { // you get i for indexes corresponding to the sentence element and not `line` elements as created above 
       line.remove(i); // i is iterated over the list of sentences in your case 3, would start from i=0 
       i--; // you change it to '-1' and get IndexOutOfBounds 
       break; 
      } 
     }//end for 
     list.set(i, String.join(" ", line)); 
    }//end for 

テストが、あなたのような何かを行うことができていないが - ただ、この種のフィルタリングを行うためのJavaの8バージョンを追加する

public static void main(String[] args) { 
    String[] words = {"a", "the", "in", "if", "are", "it", "is"}; 
    List<String> wordList = new ArrayList<>(Arrays.asList(words)); 
    String[] tArray = {"a table is here", "books are sold", "if it is readable"}; 
    List<String> list = new ArrayList<>(Arrays.asList(tArray)); 

    for (int i = 0; i < list.size(); i++) { 
     String[] tArrays = list.get(i).split(" "); 
     List<String> line = new ArrayList<>(Arrays.asList(tArrays)); 
     for (String lineElement : line) { 
      if (wordList.contains(lineElement)) { 
       line.remove(lineElement); 
      } 
     } 

     list.set(i, String.join(" ", line)); 
    } 

    for (String string : list) { 
     System.out.println(string); 
    } 
} 
1

を:

String[] filtered = 
     list.stream().map(statement -> Arrays.asList(statement.split(" "))) 
        .map(listOfWords -> listOfWords.stream() 
          .filter(word -> !wordList.contains(word)) 
          .collect(Collectors.joining(" ")) 
         ) 
         .toArray(String[]::new); 
List<String> filteredList = Arrays.asList(filtered); 

あなたは

filteredList.stream().forEach(System.out::println); 
0を使用して出力を確認できます。

希望すると便利です。

関連する問題