0

これは私の最初の投稿です。word大文字と小文字を区別せずに、文字列をすべてのArrayList要素と比較し、それらが等しいかどうかを確認する方法を考え出すのに何時間も費やしました。

これが私のコードです。

private static void writeFile(Scanner scanWords, ArrayList<String> wordList,
  FileWriter fo, BufferedWriter out) throws IOException {
    String word = null;
    int count = 0;
    boolean contains=false;
    String temp = "";

    for(int i = 0; i<wordList.size();i++){

        while(scanWords.hasNext()){
            word= scanWords.next();

            if(wordList.get(i).equalsIgnoreCase(word)){
                contains = true;
            }else{
                System.out.println(word);
                out.write(word);
                //out.write(word);
            }
        }
    }
    count++;
    out.close();
}

与えられた助けは素晴らしいでしょう。

4

3 に答える 3

3

まず、大文字と小文字を区別List<String>しない文字列に変換します。HashSetつまり、すべて小文字に変換します (String.toLowerCase()メソッドを使用)。Collection.contains()次に、メソッドを使用できます

例えば

List<String> strings;
Set<String> lowerCaseStrings = new HashSet<String>(strings.size());
for (String str : strings){
  lowerCaseStrings.add(str.toLowerCase());
}
boolean match = lowerCaseString.contains(myStr.toLowerCase());

編集: を使用することを提案してArrayList<String>いましたが、そうする必要がありますHashSet<String>- 以下のコメントを参照してください。

于 2012-05-26T13:01:15.363 に答える
1

この問題は、同じ方法で 3 つの異なることを間違った順序で実行しようとしていることに起因しています。

  • ファイルに書き込む
  • リスト内の単語を見つける
  • スキャナーから単語を読み取る

これらの操作はそれぞれ個別のものにする必要があります。頼んだものについて:

String ie word をすべての ArrayList 要素と比較し、それらが等しいかどうかをチェックし、大文字と小文字を区別しない方法

これは、完全なプログラムの一部であり、独自のメソッドに含める必要があります (上記のリストの 2 番目の箇条書き)。これには Scanner と FileWriter と BufferedWriter は必要ありません。必要なのは単語とリストだけです。メソッドはブール値を返す必要があります。

public boolean listContainsWordIgnoringCase(List<String> list, String word) {

実装は非常に簡単です。

public boolean listContainsWordIgnoringCase(List<String> list, String word) {
    for (String element : list) {
        if (word.equalsIgnoreCase(element)) {
            // no need to continue looping. We've found the answer
            return true;
        }
    }
    // we've looped through all the elements without finding a match
    return false;
}

これで、このメソッドをプログラムで使用できます。

秘訣は、1 つの責任しか持たない単純なブロックにロジックを分離することです。そして、このブロックごとにメソッドを作成します。

于 2012-05-27T08:30:14.030 に答える
0

String iewordをすべてのArrayList要素と比較する方法 ...

scanWordsスキャナ オブジェクトを正しく 使用していないようです。

コードを使用して、最初wordsListの要素がどの要素とも一致しない場合、どのscanWords要素もwordsList比較のために処理されません。リストの最初の単語と比較するためにscanWords、次の呼び出しがhasNext()常にfalse.

以下は、要件に対する修正です。

while ( scanWords.hasNext() ) {
  word= scanWords.next();
  //for( int i = 0; i < wordList.size(); i++ ) {
  for( String wordInList : wordList ) {
    if( wordInList.equalsIgnoreCase( word ) ) {
      contains = true;
    } else {
      System.out.println( word );
      out.write( word );
    }
  } // for list
} // while scanner

解決策 2 :

以前にこの方法を試しましたが、問題は同じ単語を 6 回ループすることです。6 は私の配列リストのサイズです。

これは、リスト要素で明示的なループを行わない簡単な解決策です。

String listElements = wordList.toString().toLowerCase();  
while ( scanWords.hasNext() ) {  
  word = scanWords.next();  
  if ( listElements.contains( word.toLowerCase() ) ) {  
    contains = true;  
  } else {  
    System.out.println( word );  
    out.write( word );  
  }  
} // while scanner  

サンプル実行:

List<String> ls = new ArrayList<String>( 4 );
ls.add( "raVi" );
ls.add( "sreekaR" );
ls.add( "lakShMi" );
ls.add( "sumAna" );

String listElements = ls.toString();
System.out.println( "listElements: " + listElements );
System.out.println( "listElements.toLowerCase(): " + listElements.toLowerCase() );
scanner = new Scanner( "Ravi Sumana Others sREEKar LAKshmi" );
while( scanner.hasNext() ) {
  String w1 = scanner.next();
  System.out.println( "'" + w1 + "' is in list ? = " + listElements.toLowerCase().contains( w1.toLowerCase() ) );
}

そして、実行結果は次のとおりです。

listElements: [raVi, sreekaR, lakShMi, sumAna]
listElements.toLowerCase(): [ravi, sreekar, lakshmi, sumana]
'Ravi' is in list ? = true
'Sumana' is in list ? = true
'Others' is in list ? = false
'sREEKar' is in list ? = true
'LAKshmi' is in list ? = true
于 2012-05-26T13:40:34.937 に答える