2012-05-26 96 views
0

這是我的第一篇文章。我花了幾個小時試圖找出如何將我的字符串(即word)與我所有的ArrayList元素進行比較,檢查它們是否相等,無視情況。比較ArrayList中的字符串。 Case Sensative

這是我的代碼。

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(); 
} 

提供的任何幫助將是驚人的。

回答

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> - 見下面的評論。

+0

好吧,這看起來很有希望,我可能會放棄這一點。 – user1419012

+0

這真的有助於感謝,我的程序也循環不正常。使用臨時數組是個好主意。乾杯。一個問題是。爲什麼wouldnt lowerCaseString.equalsToIgnoreCase()不起作用。 ?是因爲數組列表只是保存字符串的內存位置,而不是字符串本身。你不能讓一個存儲位置等於另一個? – user1419012

+0

'「String」.toLowerCase()。equalsIgnoreCase(「stRiNg」)'工作並且是'true',當然,除非''StringX「'包含不存在於」「stRinNgY」中的字符或者字符序列不同。 –

0

我怎麼能比我的字符串即word我所有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 
+0

我以前試過這個方法,問題是它通過同一個單詞循環6次。 6是我的數組列表的大小。 – user1419012

+0

@ user1419012你的意思是,尋找一個沒有在列表中循環的解決方案? –

+0

@ user1419012 - 使用我的新解決方案檢查更新。 –

1

的問題來自於一個事實,即你想以錯誤的順序做3件不同的事情在同樣的方法:

  • 寫入文件
  • 在列表
  • 讀單詞從掃描儀

這些操作應該是一個單獨的一個找一個字。至於你問什麼:

我怎麼可以在我的字符串即字比較我所有的ArrayList元素, 檢查,如果他們是平等的,無論情況

這是整個程序的一部分是應該用自己的方法(上面列表中的第二個項目符號)。你不需要一個掃描儀,一個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; 
} 

現在可以在你的程序中使用此方法。

訣竅是將邏輯分成只有一個責任的簡單塊。併爲每個塊創建一個方法。

+0

+1,用於鼓勵分離顧慮。 – amaidment