0

这是我的第一篇文章。我花了几个小时试图弄清楚如何将我的 String ieword与我的所有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 元素进行比较,检查它们是否相等,不考虑大小写

这是您完整程序的一部分,应该采用自己的方法(上面列表中的第二个项目符号)。为此,您不需要 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;
}

现在这个方法可以在你的程序中使用。

诀窍是将逻辑分离为只有一个职责的简单块。并为每个块制作一个方法。

于 2012-05-27T08:30:14.030 回答
0

我如何将我的 String ieword与我的所有ArrayList元素进行比较...

看来,您scanWords错误地使用了扫描仪对象。

使用您的代码,如果您的第一个元素wordsList与任何元素都不匹配scanWords,则不会处理任何元素以wordsList进行比较。为什么是因为,为了与列表中的第一个单词进行比较,您已经迭代到最后scanWords导致下一次调用hasNext()始终返回 a 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 回答