0

ファイルから入力を取得し、ファイル内の各単語をトークンとして保存し、各トークンを配列リストに追加するプログラムがあります。

問題は、arrayList が ["cat","dog"," "," ","bird"] のように表示され、arrayList にスペースが必要ないことです。

そして、読み込まれるファイルは次のように設定されます。

cat dog


bird

空白行がスペースの原因であることは明らかですが、空白行は必要です。

とにかく、私のコードは以下の通りです:

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class NewMain{

public static void main(String[] args){

    try{
        FileInputStream fstream = new FileInputStream("Filename");

        //Get the object of datainputstream
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;

        List<String> listOfWords = new ArrayList<String>();
       while((strLine = br.readLine()) != null){
        String [] tokens = strLine.split("\\s+");
        String [] words = tokens;
        for(String word : words){
            listOfWords.add(word);
            System.out.print(word);
            System.out.print(" ");      
        } 
        System.out.print("\n");
    }
       System.out.println(listOfWords);

        List<String> space = new ArrayList<String>();
        String[] spaces = {" "};
        space.addAll(Arrays.asList(spaces));

        editList(listOfWords,space);

        System.out.println(listOfWords);
in.close();
    }
    catch(Exception e){
        System.err.println("Error: " + e.getMessage());    
    }  
}

public static void editList(Collection<String> list1, Collection<String> list2){
    Iterator<String> it = list1.iterator();
        while(it.hasNext()){         
       if(list2.contains(it.next())) {
                it.remove();
            }  
       }
}
} 

ファイル以外のString[] spaces = {" "};arrayListからスペースを削除してテストしたため、空白を削除する必要があります。そして奇妙なことに、これを変更するとString[] spaces = {"cat"};、arrayList から cat が削除されます。

4

3 に答える 3

3

その理由は明らかです。考えられる解決策は、これを使用することです:

strLine = br.readLine().trim()

while次に、ループを次のように実装します。

while (strLine != null && !strLine.isEmpty()) { //do stuff }

于 2012-12-30T11:32:08.770 に答える
2

for ループに if 条件を追加します。

for(String word : words){
            if(!word.equals(""))  /* OR if( (word.length > 0) )*/  {
            listOfWords.add(word);
            System.out.print(word);
            System.out.print(" ");   
           }   
        } 
于 2012-12-30T11:30:06.953 に答える
2

空の文字列を削除してみてください- 空白パターン\s+で分割したため、リストにはありませんが、 :" """

String[] spaces = {""};

ただし、後で削除するのではなく、最初から追加しないでください。

if (word.length() == 0) continue;
listOfWords.add(word);

(そして、必要な同様のフィルターを追加してください!)

これは単純なだけではありません。また、はるかに効率的です。配列リストから要素を削除すると、コストがかかりますO(n)。したがって、フィルタリングに使用したコードの複雑さは次のとおりです ( 2 番目のリストにコピーすることでO(n^2)、これを理解できます)。O(n)そもそも要素を追加しないことは、基本的に無料です。あなたの解析はこの方法で少し速くなります - まだ ですO(n)が、2番目のステップでフィルターよりも速くなります。

于 2012-12-30T11:32:20.350 に答える